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

微服务:从header中获取用户存入当前线程

1、从网关gateway工程filter中解析token携带的当前用户信息并添加到header中

            //获取token携带的idObject userid = claimsBody.get("id");//在header中添加新的信息ServerHttpRequest serverHttpRequest = request.mutate().headers(httpHeaders -> {httpHeaders.add("userId", userid + "");}).build();//重置headerexchange.mutate().request(serverHttpRequest).build();

        filter完整代码

package com.heima.app.gateway.filter;import com.heima.app.gateway.util.AppJwtUtil;
import io.jsonwebtoken.Claims;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;@Component
@Slf4j
public class AuthorizeFilter implements Ordered, GlobalFilter {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {//1.获取request和response对象ServerHttpRequest request = exchange.getRequest();ServerHttpResponse response = exchange.getResponse();log.info("拦截到请求 {}", request.getURI().getPath());//2.判断是否是登录//在header中添加新的信息if(request.getURI().getPath().contains("/login")){//放行return chain.filter(exchange);}//3.获取tokenString token = request.getHeaders().getFirst("token");log.info("获取到token {}", token);//4.判断token是否存在if(StringUtils.isBlank(token)){response.setStatusCode(HttpStatus.UNAUTHORIZED);log.info("token不存在");return response.setComplete();}//5.判断token是否有效try {Claims claimsBody = AppJwtUtil.getClaimsBody(token);//是否是过期int result = AppJwtUtil.verifyToken(claimsBody);if(result == 1 || result  == 2){response.setStatusCode(HttpStatus.UNAUTHORIZED);log.info("token过期");return response.setComplete();}//获取token携带的idObject userid = claimsBody.get("id");//在header中添加新的信息ServerHttpRequest serverHttpRequest = request.mutate().headers(httpHeaders -> {httpHeaders.add("userId", userid + "");}).build();//重置headerexchange.mutate().request(serverHttpRequest).build();}catch (Exception e){e.printStackTrace();response.setStatusCode(HttpStatus.UNAUTHORIZED);return response.setComplete();}log.info("放行===> {}",request.getURI().getPath());//6.放行return chain.filter(exchange);}/*** 优先级设置  值越小  优先级越高* @return*/@Overridepublic int getOrder() {return 0;}
}

2、在utils工程下创建一个线程工具类WmThreadLocalUtil

package com.heima.utils.thread;import com.heima.model.common.wemedia.model.po.WmUser;public class WmThreadLocalUtil {private final static ThreadLocal<WmUser> WM_USER_THREAD_LOCAL = new ThreadLocal<>();//存入线程中public static void setUser(WmUser wmUser){WM_USER_THREAD_LOCAL.set(wmUser);}//从线程中获取public static WmUser getUser(){return WM_USER_THREAD_LOCAL.get();}//清理public static void clear(){WM_USER_THREAD_LOCAL.remove();}}

     

3、在业务项目中创建拦截器 WmTokenInterceptor 

        得到header中的用户信息并存入当前线程

package com.heima.wemedia.interceptor;import com.heima.model.common.wemedia.model.po.WmUser;
import com.heima.utils.thread.WmThreadLocalUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Optional;@Slf4j
public class WmTokenInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//得到header中的信息String userId = request.getHeader("userId");Optional<String> optional = Optional.ofNullable(userId);if(optional.isPresent()){//把用户id存入threadloacl中WmUser wmUser = new WmUser();wmUser.setId(Integer.valueOf(userId));WmThreadLocalUtil.setUser(wmUser);log.info("wmTokenFilter设置用户信息到threadlocal中...");}return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {log.info("清理threadlocal...");WmThreadLocalUtil.clear();}
}

4、在业务工程中创建配置类WebMvcConfig并实现请求拦截

package com.heima.wemedia.config;import com.heima.wemedia.interceptor.WmTokenInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class WebMvcConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new WmTokenInterceptor()).addPathPatterns("/**");}
}

 

http://www.lryc.cn/news/116428.html

相关文章:

  • C语言系列之原码、反码和补码
  • 程序框架——UI管理模块
  • MySQL 慢查询探究分析
  • wpf 项目中使用 Prism + MaterialDesign
  • 【Spring Boot】Thymeleaf模板引擎 — Thymeleaf页面布局
  • 整理mongodb文档:删
  • 篇二十三:设计模式的综合实例:构建完整项目
  • FFmpeg常见命令行(三):FFmpeg转码
  • 合宙Air724UG LuatOS-Air script lib API--scanCode
  • 2023年新手如何学剪辑视频 想学视频剪辑如何入门
  • C++的auto究竟是何方神圣
  • 网络安全【黑客】面试题汇总
  • docker菜谱大全
  • git: git checkout命令
  • 以游戏编程的角度看待模拟时间的算法题——以PAT甲级1026 Table Tennis为例
  • SNAT与DNAT原理
  • 04-2_Qt 5.9 C++开发指南_SpinBox使用
  • 接口安全防护方案
  • 机器学习复习题
  • 无线液位传感器—简介
  • 通讯协议034——全网独有的OPC HDA知识一之聚合(三)时间加权平均
  • Android 13 Hotseat定制化修改——003 hotseat图标大小修改
  • 21、springboot的宽松绑定及属性处理类的构造注入
  • nginx负载均衡(反向代理)
  • AWS上传私有windows server2019镜像64位
  • 查看当前仓库对应的远程仓库地址
  • flask-script
  • 标准的OSI七层模型(其实了解tcp足矣)
  • 【C++】初识模板
  • 学习Pull request