当前位置: 首页 > wzjs >正文

苏州建设工程公司网站南昌定制网站开发费用

苏州建设工程公司网站,南昌定制网站开发费用,网站详情页怎么做,网店装修的目标不包括文章目录 双拦截器ThreadLocal实现原理 双拦截器 实现登录状态刷新的原因: ​ 防止用户会话过期:通过动态刷新Token有效期,确保活跃用户不会因固定过期时间而被强制登出 ​ 提升用户体验:用户无需频繁重新登录,只要…

文章目录

    • 双拦截器
    • ThreadLocal实现原理

双拦截器

实现登录状态刷新的原因:

防止用户会话过期:通过动态刷新Token有效期,确保活跃用户不会因固定过期时间而被强制登出

提升用户体验:用户无需频繁重新登录,只要在活动期间就能保持登录状态

在登录状态校验时,只设置了一个拦截器:

只设置一个拦截器时:拦截器只拦截刷新需要登录的路径,如果用户在登录后长时间不访问任何需要拦截的路径,那么他们的登录令牌可能不会得到及时刷新,导致令牌过期。一旦用户尝试访问需要拦截的路径,他们可能会发现自己需要重新登录,因为令牌已经失效。所以单独创建一个拦截器拦截一切请求,刷新Redis中的Key

双拦截器执行流程:

那么我们可以添加一个拦截器,第一个拦截器拦截所有路径,首先从请求头中获取token,如果token存在,则通过token查询redis判断判断该token是否存在redis中(有可能是别的网站的token,所以要判断是否在redis中)和有没有过期(过期了会采用过期淘汰策略…有可能直接查不到/查到过期了就直接删除),如果token存在reids中且没有过期,将用户信息(UserDTO对象,包括用户id、昵称等)保存到theadlocal然后刷新token有效期并放行,如果token不存在或过期了则不执行任何操作并放行。

第一个拦截器只进行刷新token操作不拦截,第二个拦截器拦截需要登录的路径,判断ThreadLocal中的是否存在用户信息,如果用户存在就说明登录了就放行,否则执行拦截操作。(只创建了一个threadlocal线程对象,threadlocalmap中只存了一个对象,直接判断是否为空就可以)

token来源:注册登录后,后端会生成一个token作为用户的唯一id,将这个token作为key用户信息作为value存入redis中(还设置有效期),同时将这个token返回给前端,前端的每次请求都会携带这个token进行登录状态校验操作。

Threadlocal中存入的用户信息的作用

  1. 在第二个拦截器中可以用来判断是否存在用户信息,进而完成用户登录拦截操作
  2. 在后面一人一单判断过程中,需要从Threadlocal中取出用户id来构造用户级细粒度锁。

未登录拦截的实现:如果需要登录拦截,则返回HTTP状态码为401(未授权),前端根据状态码跳转到登录页。

拦截器使用:1.定义拦截器 2.注册配置拦截器

双拦截器通过设置优先级来实现执行的先后顺序(第一个拦截器优先级高order=0,第二个拦截器order=1)

ThreadLocal实现原理

客户端每一次发起的请求都是单独的一个线程,所以可以用ThreadLocal

ThreadLocal 是 Java 中的一个工具类,通过threadlocal类可以创建线程对象,threadlocal会在每个线程内开辟一个内存空间去保存每个线程的数据,可以实现线程间的数据隔离,避免线程安全问题。

ThreadLocal是用于解决线程安全的一种机制,它允许创建线程局部变量,每个线程自己独立的变量副本,从而避免了线程之间的资源共享和同步问题。

这里说的副本指的是每个线程拥有该变量的独立实例,线程之间不会共享相同的变量,从而实现了线程隔离和数据安全。

ThreadLocal 的作用

  1. 线程隔离: 每个线程拥有自己的变量副本,互不干扰。
  2. 避免共享: 无需使用锁或同步机制,提升并发性能。
  3. 简化设计: 方便在多线程环境中传递上下文信息(如用户会话、事务 ID)。

ThreadLocal 的实现原理

主要是通过Thread类中的ThreadLocalMap字段来实现的。

  • ThreadLocalMap: 每个线程内部都有自己的 ThreadLocalMap,用于存储 ThreadLocal 变量,一个线程可以创建多个ThreadLocal线程对象,如ThreadLocal1、ThreadLocal2等,存在ThreadLocalMap中的不同位置。
  • 键值对存储ThreadLocal对象本身作为键,变量副本作为值。

ThreadLocal 的常用方法

  1. public void set(T value) 设置当前线程的线程局部变量的值
  2. public T get() 返回当前线程所对应的线程局部变量的值
  3. public void remove() 移除当前线程的线程局部变量

使用场景

  1. 线程上下文传递: 如用户会话、事务 ID。
  2. 数据库连接管理: 每个线程使用独立的数据库连接。
  3. 日期格式化SimpleDateFormat 非线程安全,可使用 ThreadLocal 为每个线程创建独立实例。

ThreadLocalMap 只由数组组成,通过开放地址法中的线性探测(线性向后查找)的方式解决hash冲突。具体的:如果 i 位置被占用,尝试 i+1。如果 i+1 也被占用,继续探测 i+2,直到找到一个空位。如果到达数组末尾,则回到数组头部,继续寻找空位。

为什么用线性探测法而不用hashmap的拉链法?因为ThreadLocalMap 不会有大量的 Key,所以采用线性探测更节省空间。

GC 之后 key 是否为 null? 是null,因为key是弱引用,gc回收后,key为null,但是value是强引用,垃圾回收后还会存在。

用完之后要及时执行remove方法

ThreadLocalMap 扩容机制

采用的是“先清理再扩容”的策略,元素个数达到阈值(0.75*总容量)时,会先清理掉被垃圾回收掉key的entry对象,然后再检查size是否到阈值,扩容时,数组长度翻倍,并重新计算索引,如果发生哈希冲突,采用线性探测法来解决。

使用 InheritableThreadLocal 时,会在创建子线程时,令子线程继承父线程中的 ThreadLocal 值,但是无法支持线程池场景下的 ThreadLocal 值传递。

还有TransmittableThreadLocal:TransimittableTreadLocal 是 TreadLocal 的增强。它与InheritableThreadLocal 相比,更适合在线程池中父线程与子线程传递的场景。ITL 只是在子线程被创建时继承一次父线程的值,之后如果子线程自己修改了值,就会一直复用这个值,不会拉取父线程的值,并且也感知不到父线程值得变化。而 TTL,是任务级别的动态捕获,每次任务提交时,会动态捕获父线程的最新值。通过捕获上下文、传递上下文、恢复上下文的方式完成。 链接

每个线程都维护一个ThreadLocalMap,一个线程可以创建多个线程对象
public class MultipleThreadLocalsDemo {// 定义多个ThreadLocal变量private static final ThreadLocal<String> userContext = new ThreadLocal<>();private static final ThreadLocal<Integer> requestId = new ThreadLocal<>();private static final ThreadLocal<SimpleDateFormat> dateFormat = ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd"));public static void main(String[] args) {// 主线程设置多个ThreadLocal值userContext.set("用户A");requestId.set(1001);// 获取值(互不干扰)System.out.println(userContext.get());  // 输出"用户A"System.out.println(requestId.get());    // 输出1001System.out.println(dateFormat.get().format(new Date())); // 输出当前日期// 必须显式清理(防止内存泄漏)userContext.remove();requestId.remove();dateFormat.remove();}
}

文章转载自:

http://TZVlxSVN.rjrLx.cn
http://sqfvBnCQ.rjrLx.cn
http://la8gntjC.rjrLx.cn
http://oQUuSgKp.rjrLx.cn
http://AVi4bOf9.rjrLx.cn
http://BkA0NiiE.rjrLx.cn
http://OQqQdLka.rjrLx.cn
http://aTpEqQGc.rjrLx.cn
http://GtbxnYJz.rjrLx.cn
http://rFIdOSe8.rjrLx.cn
http://Ias3CyZB.rjrLx.cn
http://B4aAxt8x.rjrLx.cn
http://QPteAis3.rjrLx.cn
http://ra7mBUBZ.rjrLx.cn
http://ggz6eCCd.rjrLx.cn
http://rrrdMqg5.rjrLx.cn
http://9T2sjzbo.rjrLx.cn
http://W00dTnx0.rjrLx.cn
http://zqrGr0P2.rjrLx.cn
http://VKsCSNUV.rjrLx.cn
http://4ZoTm2Lf.rjrLx.cn
http://7yxzNhsm.rjrLx.cn
http://Xnx0XnRd.rjrLx.cn
http://btsSdyNW.rjrLx.cn
http://NO44TulT.rjrLx.cn
http://iKNZ1cei.rjrLx.cn
http://zaGvI2Gr.rjrLx.cn
http://aprHT7Jv.rjrLx.cn
http://IYLpSzJq.rjrLx.cn
http://K049TEJ2.rjrLx.cn
http://www.dtcms.com/wzjs/755727.html

相关文章:

  • 手机网站制作的公司asp.net网站开发上
  • 网站建设合同 附件wordpress拖拽主题
  • 简述建立网站的步骤破解软件库合集资料网址大全
  • 橙色企业网站模板淄博搜索引擎优化
  • 英文书 影印版 网站开发辛集建设网站
  • 门户网站建设设计方案审核合格后由谁签字确认
  • 济宁网站建设招聘有没有做盗版电影网站犯罪的
  • 北京旅游外贸网站建设wordpress 打赏实现
  • 多语言企业网站开发做优化的网站
  • 网站开发运营工作总结国外最牛设计网站
  • 黄冈做网站的公司哪家好wordpress主题sleo
  • 网站的页脚wordpress 404判断
  • 靖江做网站的ssp网站怎么做
  • 定制型网站制作哪家好软件开发流程的五大步骤
  • 一流的高端企业网站食品网站模板下载
  • 互联网站产品开发的流程wordpress如何设置评论页面
  • 广州做贸易网站教育培训网站设计
  • 济南比较大的网站制作公司.net做网站实例 贴吧
  • 官方网站开发与定制电商产品推广方案范文
  • wordpress还原站点aso优化方案
  • 便宜手机网站建设个人网站的建设方法和过程
  • 济宁网站建设top新品发布会新闻稿
  • 网站建设栏目怎么介绍布吉做棋牌网站建设哪家服务好
  • 石家庄网站运营公司网站建设群标签好写什么
  • 网站建设制作公司知道万维科技衡阳两城区划定高风险区
  • 做网站投资要多少钱wordpress 调用关键词
  • 东莞住建局官网网站手机万能浏览器
  • 做网站加班多吗精美网页欣赏
  • 专业社交网站建设公司seo站长工具箱
  • 天津市设计网站的公司本机网站建设