微服务
8、传递用户信息-用户信息写入请求头
网关传递用户

步骤:一、在网关的登录效验过滤器中,把获取到的用户写入请求头
需求:修改gateway模块中的登录效验拦截器,在效验成功后保存用户到下游请求的请求头中。
提示:要修改转发到微服务的请求,需要用到ServerWebExchange类提供的API,示例如下:

代码演示:
java
Long userId = jwtTool.parseToken(token);
//4、将用户信息传递给后端
System.out.println("userId:"+userId);
//将用户id设置到请求头,改为request对象,设置请求头到后端的微服务
exchange.mutate().request(builder->{builder.header("user-info",userId.toString()).build();});
代码演示:
java
@ApiOperation("查询购物车列表")
@GetMapping
public List<CartVO> queryMyCarts(@RequestHeader(value="user-info",required = false) Long userId){
System.out.println("--------------userId"+userId);
return cartService.queryMyCarts();
}

9、微服务拦截器分析
把拦截器写到common中,都可以调用。
步骤:二、在hm-common中编写SpringMVC拦截器,获取登录用户
实现步骤:

10、微服务拦截器实现-用户信息传递
代码演示:
java
public class UserInfoInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//获取请求头user-info
String userId = request.getHeader("user-info");
//如果有值的话设置到线程版本ThreadLocal中
if(StrUtil.isNotBlank(userId)){
UserContext.setUser(Long.parseLong(userId));
}
return true;
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
//请求执行完成后要清除ThreadLocal中信息
UserContext.removeUser();
}
}
代码演示:
java
public class MvcConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new UserInfoInterceptor());
}
}
11、OpenFeign传递用户信息
OpenFeign传递用户
微服务项目中的很多业务要多个微服务共同合作完成,而这个过程中也需要传递登录用户信息,例如:

OpenFeign中提供了一个拦截器接口,所有由OpenFeign发起的请求都会先调用拦截器处理请求:

步骤:OpenFeign传递用户

代码演示:
java
//feign请求拦截器
@Bean
public RequestInterceptor feignRequestInterceptor() {
return new RequestInterceptor() {
@Override
public void apply(RequestTemplate template) {
//获取线程变量中的用户Id
Long userId = UserContext.getUser();
//设置feign请求头
if (userId != null) {
template.header("user-info", userId.toString());
}
}
};
}
12、Nacos配置共享配置项文件