• ThreadLocal优化


    测试类证明一下ThreadLocal存储的数据是线程程安全的 

    1. package com.lin.springboot01;
    2. import org.junit.jupiter.api.Test;
    3. public class testThreadLocal {
    4. @Test
    5. public void testThreadLocalSetAndGet(){
    6. //提供一个ThreadLocal对象
    7. ThreadLocal t1 = new ThreadLocal();
    8. new Thread(()->{
    9. t1.set("张三");
    10. System.out.println(Thread.currentThread().getName()+":"+t1.get());
    11. System.out.println(Thread.currentThread().getName()+":"+t1.get());
    12. System.out.println(Thread.currentThread().getName()+":"+t1.get());
    13. System.out.println(Thread.currentThread().getName()+":"+t1.get());
    14. },"绿色").start();
    15. new Thread(()->{
    16. t1.set("李四");
    17. System.out.println(Thread.currentThread().getName()+":"+t1.get());
    18. System.out.println(Thread.currentThread().getName()+":"+t1.get());
    19. System.out.println(Thread.currentThread().getName()+":"+t1.get());
    20. System.out.println(Thread.currentThread().getName()+":"+t1.get());
    21. },"黄色").start();
    22. }
    23. }

    接上一篇获取用户详细信息,用ThreadLocal进行优化

    ThreadLocalUtil:工具类

    1. package com.lin.springboot01.utils;
    2. public class ThreadLocalUtil {
    3. //提供ThreadLocal对象
    4. private static final ThreadLocal THREAD_LOCAL = new ThreadLocal();
    5. //根据键获取值
    6. public static T get(){
    7. return (T) THREAD_LOCAL.get();
    8. }
    9. //存储键值对
    10. public static void set(Object value){
    11. THREAD_LOCAL.set(value);
    12. }
    13. //清除Threadlocal 防止内存泄露
    14. public static void remove(){
    15. THREAD_LOCAL.remove();
    16. }
    17. }

     LoginInterceptor:ThreadLocalUtil.set(claims)将数据存储到ThreadLocal中

    1. package com.lin.springboot01.interceptors;
    2. import com.lin.springboot01.pojo.Result;
    3. import com.lin.springboot01.utils.JwtUtil;
    4. import com.lin.springboot01.utils.ThreadLocalUtil;
    5. import jakarta.servlet.http.HttpServletRequest;
    6. import jakarta.servlet.http.HttpServletResponse;
    7. import org.springframework.stereotype.Component;
    8. import org.springframework.web.servlet.HandlerInterceptor;
    9. import java.util.Map;
    10. @Component
    11. public class LoginInterceptor implements HandlerInterceptor {
    12. @Override
    13. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    14. String token = request.getHeader("Authorization");
    15. try {
    16. //能否解析成功
    17. Map claims = JwtUtil.parseToken(token);
    18. //把业务数据存储到ThreadLocal中
    19. ThreadLocalUtil.set(claims);
    20. //放行
    21. return true;
    22. } catch (Exception e) {
    23. //解析失败,httpServletResponse响应码设置为401
    24. response.setStatus(401);
    25. return false;
    26. }
    27. }
    28. @Override
    29. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    30. //清空Threadlocal中的数据
    31. ThreadLocalUtil.remove();
    32. }
    33. }

    UserController:改用ThreadLocalUtil获取用户name,在把参数传给findByName方法

    1. @GetMapping("/userInfo")
    2. public Result userInfo(/*@RequestHeader(name="Authorization") String token*/){
    3. /* Map map = JwtUtil.parseToken(token);
    4. String username = (String) map.get("username");*/
    5. Map map = ThreadLocalUtil.get();
    6. String username = (String) map.get("username");
    7. User user = userService.findByName(username);
    8. return Result.success(user);
    9. }

  • 相关阅读:
    Spring学习篇(四)
    Dubbo3应用开发—Dubbo序列化方案(Kryo、FST、FASTJSON2、ProtoBuf序列化方案的介绍和使用)
    全部的正则匹配
    LeetCode——1455.检查单词是否为句中其他单词的前缀
    webpack loader原理
    6、ES单机设置用户名密码、集群设置用户名密码、es-head登录、如何去掉密码
    AOP是什么?如何使用AOP?
    激光slam学习记录
    降低城市内涝风险,万宾科技内涝积水监测仪的作用
    软件成分分析(SCA)完全指南
  • 原文地址:https://blog.csdn.net/m0_71088505/article/details/134456683