关于验证码的获取,做了一个兼容策略,同一个设备,不访问多少次验证码都是同一个(刷新除外),所以我们做了两个缓存

deviceCodeCache: 缓存 deviceId 设备 与验证码之间的映射关系

verifyCodeCache: 缓存 code验证码 与 半长连接之间的映射关系// fixme 设置15min的超时时间, 超时时间一旦设置不能修改;因此导致刷新验证码并不会增加连接的有效期
SseEmitter sseEmitter = new SseEmitter(15 * 60 * 1000L);

熟练掌握多种登入方式:通过验证码和前端保持半长链接映射关系,当用户扫码关注公众号并输入验证码后,识别用户信息并找到对应半长链接,实
现系统自动登录功能。和app扫码pc端登入

掌握thymeleaf:
@{/。。。}大括号里边要用 / 开头表示根目录,不然渲染不到。。
/[[${user}]]/
表面是注释,实际是 Thymeleaf 的 “内联传递”
Thymeleaf 模板渲染逻辑:
Thymeleaf 会先解析模板里的 th:* 指令(比如 th:if th:each ),再把动态内容替换到页面。但 JavaScript 代码里直接写 const user = [[${user}]]; ,如果 user 是复杂对象(比如 JSON 格式),纯前端 JS 不认识 Thymeleaf 的表达式,会报错。
注释包裹的作用:
用 /.../ 把 [[${user}]] 包起来,对 ** 浏览器(前端 JS)来说,这就是一段普通注释,不会执行;但对Thymeleaf(后端模板引擎)** 来说,它能识别 [[${user}]] 是内联表达式,会把 user 对象序列化为 JSON 字符串,替换到注释位置。

“[[${user}]]” 也可以
. 等价的更清晰写法(推荐理解后用这种 )
为了可读性,现在更推荐显式用 Thymeleaf 的 th:inline="javascript" 结合 [[${...}]] 传递,不用注释包裹,示例:

html
预览

关键:th:inline="javascript" 告诉 Thymeleaf “这段 JS 里有模板表达式,要解析”,这样 [[${user}]] 就会被正确替换成 JSON 字符串,前端 JS 也能正常识别。
好处:比注释写法更直观,一看就知道是模板传值,不容易混淆。