网关过滤器
/**
* project : Tou-leadnews
* <p> </p>
*
* @author
* @date 2022-04-09【星期六】
**/
@Component
public class AuthorizerFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
//1.获取request和response对象
ServerHttpRequest request = exchange.getRequest();
ServerHttpResponse response = exchange.getResponse();
//2.判断是否是登录
if(request.getURI().getPath().contains("/login")){
//放行
return chain.filter(exchange);
}
//3.获取token
String token = request.getHeaders().getFirst("token");
//4.判断token是否存在
if(StringUtils.isBlank(token)){
response.setStatusCode(HttpStatus.UNAUTHORIZED);
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);
return response.setComplete();
}
//获取token中的用户ID -------------------------------------
Long id = claimsBody.get("id",Long.class);
if (id ==null || id==0) {
response.setStatusCode(HttpStatus.UNAUTHORIZED);
return response.setComplete();
}
//将用户id发送到下游微服务
ServerHttpRequest serverHttpRequest = request.mutate().headers(httpHeaders -> httpHeaders.add("userId", id + "")).build();
ServerWebExchange webExchange = exchange.mutate().request(serverHttpRequest).build();
return chain.filter(webExchange);
} catch (Exception e) {
e.printStackTrace();
}
//6.放行
return chain.filter(exchange);
}
@Override
public int getOrder() {
return 0;
}
}
在服务这一层我们通过拦截器拿到用户id
链接: 2.配置拦截器,获取Request中的用户id,把用户id放入到ThreadLocal中.