Skip to content

登录鉴权

登录

  1. 校验逻辑:账号是否存在、密码是否正确、是否加入过黑名单
  2. userId进行md5生成token
  3. 缓存tokenuserId关系到redis
  4. 浏览器域名下存cookie信息,cookie有效期是 5 天

登录流程:校验 → 生成 token → Redis 缓存 → 写入 Cookie

鉴权

  1. 所有请求被RequestFilter拦截,这个过滤器会拦截所有的请求

    java
    @Order(-6)
    @WebFilter(filterName = "requestFilter", urlPatterns = {"/*"}, asyncSupport = true)
    public class RequestFilter implement Filter {
      // ....
    }
    • order值越小,优先级越高
    • 拦截所有请求
    • asyncSupport配置是给sse异步响应的支持
  2. HttpServletRequest中获取所有的cookie,它是一个数组,如果cookie是空的,则认为你没有登录,从cookie里找到对应的配置的key,然后找到对应的字符串

  3. 找登录等权的cookie,取token

  4. 根据token查询redis,获取对应的登录用户的userId

  5. userId保存到当前主线程的threadLocal副本中(在后续执行任务的任何阶段都可以从主线程中获取到userId)

  6. 执行后续的接口逻辑(需要当前登录用户信息,直接从SessionHelper中获取)

  7. 接口逻辑执行完成后,在finally中清理threadLocal副本信息,防止内存泄露

鉴权流程 7 步:RequestFilter 拦截 → 取 Cookie → 查 Redis → 写入 ThreadLocal → 执行业务 → finally 清理

threadLocal 内存泄露的原因

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

ThreadLocal 内存泄露两大根因:线程复用副本堆积;key 弱引用而 value 强引用

最近更新