ThreadLocal优化

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

java 复制代码
    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:工具类

java 复制代码
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中

java 复制代码
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方法

java 复制代码
    @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);
    }
相关推荐
w2sfot17 小时前
Passing Arguments as an Object in JavaScript
开发语言·javascript·ecmascript
郝学胜-神的一滴17 小时前
避免使用非const全局变量:C++中的最佳实践 (C++ Core Guidelines)
开发语言·c++·程序人生
我没想到原来他们都是一堆坏人18 小时前
(未完待续...)如何编写一个用于构建python web项目镜像的dockerfile文件
java·前端·python
搞一搞汽车电子18 小时前
S32K3平台eMIOS 应用说明
开发语言·驱动开发·笔记·单片机·嵌入式硬件·汽车
沙二原住民18 小时前
提升数据库性能的秘密武器:深入解析慢查询、连接池与Druid监控
java·数据库·oracle
上官浩仁18 小时前
springboot redisson 缓存入门与实战
spring boot·redis·缓存
小小工匠18 小时前
SpringBoot - Spring 资源加载全解析:ResourceLoader 与 ResourceUtils 的正确打开方式
spring boot·spring·resourceloader·resourcutils
Jerry&Grj18 小时前
SpringBoot埋点功能技术实现方案深度解析:架构设计、性能优化与扩展性实践
java·微服务·性能优化·springboot·架构设计·埋点技术
没有bug.的程序员18 小时前
Redis Stream:轻量级消息队列深度解析
java·数据库·chrome·redis·消息队列
总有刁民想爱朕ha18 小时前
车牌模拟生成器:Python3.8+Opencv代码实现与商业应用前景(C#、python 开发包SDK)
开发语言·python·数据挖掘