天天看点

基于ThreadLocal实现,拦截器获取的用户信息在接口中使用

一、为什么要把拦截器中验证用户信息时获取到的信息在接口实现中使用呢??

一、为什么要这么做??

答:首先我们拦截器会通过token去 库里获取最新的用户信息,判断用户状态来执行是否拦截,这个时候如果我们接口实现中也需要使用用户信息,那么重新查一遍的话会增加一次数据库访问,而拦截器查询到接口使用,中间时间我觉得可以忽略不计;毕竟如果一些强烈要求实时的数据,自然会重新加锁。

二、pom文件依赖

<!-- transmittable -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>transmittable-thread-local</artifactId>
            <version>2.11.5</version>
        </dependency>
           

三、UserContextHolder 代码实现

package com.prison.extranet.config;

import com.alibaba.ttl.TransmittableThreadLocal;
import com.prison.core.entity.SysUser;
import lombok.experimental.UtilityClass;

/**
 * @author WangJing
 * @Description: sys用户 ThreadLocal 工具类
 * @date 2021/6/9 11:06
 */
@UtilityClass
public class SysUserContextHolder {

	private final ThreadLocal<SysUser> THREAD_LOCAL_SYS_USER = new TransmittableThreadLocal<>();
	
	private final ThreadLocal<String> TOKEN = new TransmittableThreadLocal<>();


	/**
	 * 设置app用户信息
	 * @param
	 */
	public void setUser(SysUser appUser) {
		THREAD_LOCAL_SYS_USER.set(appUser);
	}
	
	public void setToken(String token) {
		TOKEN.set(token);
	}

	/**
	 * 获取app用户信息
	 * @return
	 */
	public SysUser getUser() {
		return THREAD_LOCAL_SYS_USER.get();
	}
	
	public String getToken() {
		return TOKEN.get();
	}

	public void clear() {
		THREAD_LOCAL_SYS_USER.remove();
		TOKEN.remove();
	}

}
           

四、放入数据--拦截器完执行存放数据

// 注入threadLocal
            SysUserContextHolder.setUser(user);
            SysUserContextHolder.setToken(token);
           

五、获取数据--SysUserContextHolder的get方法获取到数据

SysUser user = SysUserContextHolder.getUser();
           

注:以上内容仅提供参考和交流,请勿用于商业用途,如有侵权联系本人删除!