登录鉴权
登录
- 校验逻辑:账号是否存在、密码是否正确、是否加入过黑名单
- 对
userId进行md5生成token - 缓存
token与userId关系到redis - 浏览器域名下存
cookie信息,cookie有效期是 5 天

鉴权
所有请求被
RequestFilter拦截,这个过滤器会拦截所有的请求java@Order(-6) @WebFilter(filterName = "requestFilter", urlPatterns = {"/*"}, asyncSupport = true) public class RequestFilter implement Filter { // .... }- order值越小,优先级越高
- 拦截所有请求
asyncSupport配置是给sse异步响应的支持
从
HttpServletRequest中获取所有的cookie,它是一个数组,如果cookie是空的,则认为你没有登录,从cookie里找到对应的配置的key,然后找到对应的字符串找登录等权的
cookie,取token根据
token查询redis,获取对应的登录用户的userIduserId保存到当前主线程的threadLocal副本中(在后续执行任务的任何阶段都可以从主线程中获取到userId)执行后续的接口逻辑(需要当前登录用户信息,直接从
SessionHelper中获取)接口逻辑执行完成后,在
finally中清理threadLocal副本信息,防止内存泄露

threadLocal 内存泄露的原因
- 主线程
Thread由tomcat连接器线程池创建和分配,既然是线程池就会存在线程复用,线程如果一直被复用,也就是一直不被销毁,那么threadLocal的值就会一直在内存中保存,一旦请求很多,创建的副本数据很多,内容会扛不住,就会OOM threadLocal的key是弱引用,而value Object是强引用,即使threadLocal对象没有引用时,也只会回收内部类的key,出现key为null的map,但是value还是一直存在,一直无法被回收。

