一、自定义类 LocalVariable

package com.lh.mes.base.thread;

import java.util.Optional;

public class LocalVariable {

    private LocalVariable() {

    }

    private static final ThreadLocal<String> PRINCIPAL_ID = new ThreadLocal<>();

    /**
* 添加用户id
* @param principalId 用户id
*/
public static void setPrincipalId(String principalId) {
PRINCIPAL_ID.set(principalId);
} /**
* 获取用户id
* @return 用户id
*/
public static String getPrincipalId() {
return PRINCIPAL_ID.get();
} public static Optional<String> getPrincipalIdOptional() {
return Optional.ofNullable(getPrincipalId());
}
}

二、拦截器保存想要保存的值

package com.lh.mes.base.interceptor;

import com.lh.mes.base.annotation.Authorization;
import com.lh.mes.base.constant.AuthorizationConstants;
import com.lh.mes.base.thread.LocalVariable;
import com.lh.mes.base.utils.TokenUtil;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.ExpiredJwtException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import springfox.documentation.swagger.web.ApiResourceController;
import springfox.documentation.swagger2.web.Swagger2Controller; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method; /**
* token 拦截器
* @author Niles
*/
@Slf4j
@Component
public class AccessTokenInterceptor implements HandlerInterceptor { /** redis 数据库操作模板类*/
@Autowired
private RedisTemplate<String, String> redisTemplate; @Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
//如果不是映射到方法直接通过
if (!(handler instanceof HandlerMethod)
|| ((HandlerMethod) handler).getBean() instanceof ApiResourceController
|| ((HandlerMethod) handler).getBean() instanceof Swagger2Controller) {
return true;
}
HandlerMethod handlerMethod = (HandlerMethod) handler;
Method method = handlerMethod.getMethod();
Authorization authorization = method.getAnnotation(Authorization.class);
if (authorization != null && !authorization.required()) {
//过滤不拦截的方法
return true;
}
//从header中得到token
String token = request.getHeader(AuthorizationConstants.AUTHORIZATION);
if (!StringUtils.hasText(token)) {
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
return false;
}
Claims claims;
try {
claims = TokenUtil.parseJWT(token);
} catch (ExpiredJwtException expiredJwtException) {
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
log.warn("token 过期了");
return false;
} catch (Exception exception) {
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
log.warn("无效 token");
return false;
}
String principalId = claims.getId();
if (!redisTemplate.opsForSet().isMember(AuthorizationConstants.REDIS_TOKEN_KEY + principalId, token)) {
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
log.info("用户不存在或已失效,请重新登录");
return false;
}
LocalVariable.setPrincipalId(principalId);
return true;
} }

三、获取保存的值

    /**
* 获取当前登录用户id
*
* @return 当前登录用户id
*/
@Override
public String getCurrentPrincipalId() {
return LocalVariable.getPrincipalId();
}

最新文章

  1. CMakeLists.txt
  2. Android 使用Socket进行通信(Android)
  3. 基于android平台的出题软件---- 每日30题
  4. SSH项目(struts+spring+hibernate)搭建_代码简化
  5. ASP.Net MVC开发基础学习笔记(5):区域、模板页与WebAPI初步
  6. IIS8中部署WCF服务出错:HTTP 错误 404.3 - Not Found
  7. AX 用代码创建FORM动态加控件,重载动态添加的控件的方法。
  8. Jmeter测试Mysql
  9. selinux --chcon命令
  10. Mac设置截图保存位置
  11. __attribute__ ((__section__ (&quot;.init.text&quot;)))
  12. php composer
  13. 【数学】XMU 1593 找数字
  14. ORA-12638: 无法检索身份证明 解决的方法
  15. mysql关联删除
  16. ==与equals()方法的不同
  17. SAS 对数据的拼接与串接
  18. Java_初入IO流_字符流_Write-Read_小笔记
  19. php优秀框架codeigniter学习系列——common.php
  20. SpringMVC框架05——拦截器

热门文章

  1. NSSCTF-[UTCTF 2020]Zero
  2. .Net Core之JWT授权
  3. Java课程设计---WindowBuilder插件安装
  4. 鼠标点击的时候出现 &quot;双心心&quot; 的效果
  5. AHUACM寒假集训VI(网络流)
  6. Pycharm:注释、删除所有注释
  7. 任意文件夹打开CMD命令窗口
  8. JZ-002-替换空格
  9. WPF页面后台代码InitializeComponent()报错
  10. Python自动化 unittest生成测试报告(HTMLTestRunner)03