场景:
在网关中实现登录校验时,可以将用户信息存到要转发的请求头中,然后再进行转发,这样在路由的服务中就可以从请求头中获取到用户信息然后自己保存下来(比如使用thread local)
/*
* 就是获取到要转发的http请求,将用户信息存到请求头中,然后再进行转发
* 这里是将用户的id进行存储
* */
//在 HTTP 协议中,所有的头部信息都必须是文本(字符串)形式。所以这里先转为string
String userInfo = userId.toString();
ServerWebExchange ex = exchange.mutate()
.request(b -> b.header("user-info", userInfo))
.build();
// 转发放行
return chain.filter(ex);
但是在实际业务处理过程中,通常需要通过openfeign调用其他微服务提供的服务,从外部请求--微服务之间经过网关,所以可以在网关中处理;而在微服务请求--微服务之间,不经过网关。那么可以在feign进行远程调用之前通过拦截器对请求再做处理(将用户信息添加到请求头):
@Bean
public RequestInterceptor userInfoRequestInterceptor(){
return new RequestInterceptor() {
@Override
public void apply(RequestTemplate template) {
// 获取登录用户
Long userId = UserContext.getUser();
if(userId == null) {
// 如果为空则直接跳过
return;
}
// 如果不为空则放入请求头中,传递给下游微服务
template.header("user-info", userId.toString());
}
};
}