首页 > 其他分享 >## 利用ThreadLocal优化获取用户基本信息(2024-3-13)

## 利用ThreadLocal优化获取用户基本信息(2024-3-13)

时间:2024-03-13 20:33:57浏览次数:17  
标签:13 set String get ## 2024 ThreadLocal import public

  • ThreadLocal提供线程的局部变量(set和get方法)
  • 线程之间互不影响
//测试类
package com.di.bigevent;

import org.junit.jupiter.api.Test;

public class ThreadLocalTest {

    @Test
    public void testThreadLocalSetAndGet(){

        ThreadLocal tl = new ThreadLocal();

        new Thread(()->{
            tl.set("李星云");
            System.out.println(Thread.currentThread().getName()+": "+ tl.get());
        },"蓝色").start();

        new Thread(()->{
            tl.set("袁天罡");
            System.out.println(Thread.currentThread().getName()+": "+ tl.get());
        },"绿色").start();
    }
}

//拦截器类
package com.di.bigevent.interceptors;

import com.di.bigevent.utils.JwtUtil;
import com.di.bigevent.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){
            response.setStatus(401);
            //不放行
            return false;
        }
    }

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

//Controller
@GetMapping("userInfo")
    public Result<Object> 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.findByUserName(username);

        return Result.success(user);
    }
//util
package com.di.bigevent.utils;

/**
 * ThreadLocal 工具类
 */
@SuppressWarnings("all")
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();
    }
}

标签:13,set,String,get,##,2024,ThreadLocal,import,public
From: https://www.cnblogs.com/muzhaodi/p/18071466

相关文章

  • python 猜数字 random
    #猜数字如果数字太大则输出Toolarge!如果数字太小则输出Toosmall!如果猜中则输出Justright!importrandomnumber=random.randint(1,100)whileTrue: num=int(input('输入1-100之间的数')) ifnum>number: print('你猜的数字太大了请重新输入') elifnu......
  • 【Azure Redis】部署在AKS中的应用连接Redis时候出现Unable to connect to Redis serv
    问题描述在AKSPod中连接AzureRedis服务,大概率出现连接不上的问题。大多数的错误为 RedisConnectionException:UnabletoconnecttoRedisserver:xxxxxxxxx.redis.cache.chinacloudapi.cn/52.xxx.xxx.xxx:6380,但是有时候的错误信息为: RedisConnectionException:Unable......
  • c++:类和对象中:拷贝构造和赋值运算符重载详解
    c++:类和对象构造函数和析构函数详解`文章目录c++:类和对象构造函数和析构函数详解前言一、拷贝构造怎么写拷贝构造1.拷贝构造也是构造函数的一种,构造函数没有值.所以拷贝构造也没有返回值**2.拷贝构造只有一个形参,正常这个形参是自定义类型对象的引用.3.如果我们......
  • Python中AdaBoost与GBDT模型【附代码】
    目录1、AdaBoost算法的原理介绍(1)AdaBoost算法核心思想(2)AdaBoost算法数学原理概述1、初始化各个样本点权重,各权重相等2、计算误差率3、调整弱学习区权重4、更新样本点权重5、反复迭代6、正则化项(3)AdaBoost算法的简单代码实现2、案例- AdaBoost信用卡精准营销模型......
  • HADOOP完全分布式搭建(饭制版)
    HADOOP完全分布式搭建(饭制版)1.虚拟机安装安装系统点击VMwareWorkstation左上角文件,新建虚拟机选择自定义,点击下一步点击下一步选择稍后安装操作系统(后续我们使用的操作系统为CentOS7),点击下一步客户机系统选择Linux,版本选择CentOS764位,点击下一步自定义安......
  • L1-011 A-B(C和C++)
    题目:本题要求你计算A−B。不过麻烦的是,A和B都是字符串——即从字符串A中把字符串B所包含的字符全删掉,剩下的字符组成的就是字符串A−B。输入格式:输入在2行中先后给出字符串A和B。两字符串的长度都不超过104,并且保证每个字符串都是由可见的ASCII码和空白字符组成,最后以换行......
  • 每日leetcode--接雨水
    引言接雨水问题是一个经典的算法问题,它要求我们计算给定一组不同高度的墙壁时,这些墙壁之间能够蓄积多少雨水。解决这个问题的方法有很多,其中一种常见的解法是通过辅助数组来记录每个位置的左右最大高度,并计算每个位置上方能够蓄积的雨水量。问题描述假设我们有一个非负整数......
  • 使用Julia语言展示几何平均值与算数平均值在实际应用中的差别(采用注册计量师考试试题
    理论部分在注册计量师考试中有一道试题,大体内容为:现在有一块砝码在等臂天平上进行测量,第一次测得值是19.6g,调换两边位置后的测得值是19.7g,天平最终测得检测样品的重量为多少? 个别同事可能会将算数平均值作为这个砝码的最终测量值,但实际应当使用几何平均值的方式计算,算数......
  • Java基础笔记
    jdk、jre、jvm三者之间的关系Java语言开发程序能够做到一次编写处处运行(能够跨平台运行)java中的注释  Java中的关键字和保留字  ......
  • 浅谈HTTP 和 HTTPS (中间人问题)
    前言由于之前的文章已经介绍过了HTTP,这篇文章介绍HTTPS相对于HTTP做出的改进开门见山:HTTPS是对HTTP的加强版主要是对一些关键信息进行了加密一.两种加密方式1.对称加密公钥+明文=密文密文+公钥=明文2.非对称加密举个例子就好比小区邮箱提供......