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

ThreadLocal优化

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

    package com.lin.springboot01;

    import org.junit.jupiter.api.Test;

    public class testThreadLocal {
        @Test
        public void testThreadLocalSetAndGet(){
            //提供一个ThreadLocal对象
            ThreadLocal t1 = new ThreadLocal();
            new Thread(()->{
                t1.set("张三");
                System.out.println(Thread.currentThread().getName()+":"+t1.get());
                System.out.println(Thread.currentThread().getName()+":"+t1.get());
                System.out.println(Thread.currentThread().getName()+":"+t1.get());
                System.out.println(Thread.currentThread().getName()+":"+t1.get());
            },"绿色").start();

            new Thread(()->{
                t1.set("李四");
                System.out.println(Thread.currentThread().getName()+":"+t1.get());
                System.out.println(Thread.currentThread().getName()+":"+t1.get());
                System.out.println(Thread.currentThread().getName()+":"+t1.get());
                System.out.println(Thread.currentThread().getName()+":"+t1.get());
            },"黄色").start();
        }

    }

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

ThreadLocalUtil:工具类

package com.lin.springboot01.utils;

public class ThreadLocalUtil {
    //提供ThreadLocal对象
    private static final ThreadLocal THREAD_LOCAL = new ThreadLocal();

    //根据键获取值
    public static <T> T get(){
        return (T) THREAD_LOCAL.get();
    }

    //存储键值对
    public static void set(Object value){
        THREAD_LOCAL.set(value);
    }

    //清除Threadlocal 防止内存泄露
    public static void remove(){
        THREAD_LOCAL.remove();
    }
}


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

package com.lin.springboot01.interceptors;

import com.lin.springboot01.pojo.Result;
import com.lin.springboot01.utils.JwtUtil;
import com.lin.springboot01.utils.ThreadLocalUtil;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

import java.util.Map;

@Component
public class LoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String token = request.getHeader("Authorization");
        try {
            //能否解析成功
            Map<String, Object> claims = JwtUtil.parseToken(token);
            //把业务数据存储到ThreadLocal中
            ThreadLocalUtil.set(claims);
            //放行
            return true;
        } catch (Exception e) {
            //解析失败,httpServletResponse响应码设置为401
            response.setStatus(401);
            return false;
        }
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        //清空Threadlocal中的数据
        ThreadLocalUtil.remove();
    }
}

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

    @GetMapping("/userInfo")
    public Result<User> userInfo(/*@RequestHeader(name="Authorization") String token*/){
       /* Map<String, Object> map = JwtUtil.parseToken(token);
        String username = (String) map.get("username");*/
        Map<String,Object> map = ThreadLocalUtil.get();
        String username = (String) map.get("username");
        User user = userService.findByName(username);
        return Result.success(user);
    }


http://www.kler.cn/a/133112.html

相关文章:

  • 图形几何之美系列:二维凸包艺术赏析
  • 108. UE5 GAS RPG 实现地图名称更新和加载关卡
  • Tessy学习笔记—requirement(需求)的管理
  • Excel模板下载\数据导出
  • 黑马嵌入式开发入门模电基础学习笔记
  • JVM双亲委派与自定义类加载器
  • DM8共享集群DSC初始化DB实例报错
  • FreeRTOS中的内存分配策略
  • WPF xaml Command用法介绍
  • OpenAI发布会中不起眼的重大更新
  • 传输层——TCP协议
  • 【Python入门五】第三方库(包)介绍
  • 数据库课后习题加真题
  • 【如何学习Python自动化测试】—— 页面元素定位
  • WPF中的虚拟化是什么
  • 代码随想录算法训练营Day 56 || 647. 回文子串、516.最长回文子序列
  • 【MySQL】索引与事务
  • vue3的api使用
  • uart控制led与beep
  • cesium雷达效果(脉冲圆)
  • 【C++】【Opencv】cv::warpAffine()仿射变换函数详解,实现平移、缩放和旋转等功能
  • Ajax 之XMLHttpRequest讲解
  • 三、程序员指南:数据平面开发套件
  • 使用vant list实现订单列表,支持下拉加载更多
  • 【SQL server】数据库、数据表的创建
  • 第一次组会汇报(2023/11/18)