@Component
public class AuthorizeFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
//====================================
ServerHttpRequest request = exchange.getRequest();
ServerHttpResponse response = exchange.getResponse();
//1.数据校验
String url = request.getURI().getPath();
//2.业务逻辑
//如果是登录请求直接放行
if (StringUtils.isNotBlank(url) && url.contains("/login")) {
return chain.filter(exchange);
}
//获取token
String token = request.getHeaders().getFirst("token");
if (StringUtils.isBlank(token)) {
//如果token是空的就返回401
response.setStatusCode(HttpStatus.UNAUTHORIZED);
return response.setComplete();
}
try {
//判断token是否过期
Claims claimsBody = AppJwtUtil.getClaimsBody(token);
if (Objects.isNull(claimsBody)) {
//token解析失败
response.setStatusCode(HttpStatus.UNAUTHORIZED);
return response.setComplete();
}
int result = AppJwtUtil.verifyToken(claimsBody);
if(result ==1 || result==2){
response.setStatusCode(HttpStatus.UNAUTHORIZED);
return response.setComplete();
}
} catch (Exception e) {
//如果解析途中出现了异常也是失败
response.setStatusCode(HttpStatus.UNAUTHORIZED);
return response.setComplete();
}
//都通过就放行
return chain.filter(exchange);
}
@Override
public int getOrder() {
return 1;
}
}
来说说这个拦截器首先我是再nacos的配置中心配置了文件的配置了几种需要拦截的请求路径,每当我们发送http请求符合了拦截的条件就会进入这个拦截器中,首先我们通过ServerHttpRequest请求对象中的exchange获取了请求体 并且获取了其中的请求路径的参数然后对于这个请求路径,然后进行判断,如果这个路径中包含login那么说明这个请求是登录的操作那么我们就不进行token的验证直接放行就行了。
如果不是登录的操作那么就会走到下一步再请请求体中调用获取获取token 然后对token进行判断如果token是空的说明不是正常的访问返回状态码401 代表token校验失败,然后如果可以获取到token那么就对token做进一步的解析与判断,首先调用了jwt的工具类中的getClaimsBody方法这个方法获取token中的信息,如若是空说明有问题返回401,然后再将信息解析获取其中的状态码,如果这个状态码是 1 或者是 2 说明这个token是不对的就将返回401的状态码。再解析token的时候需要用try catch包裹住 因为如果再解析的过程中产生了异常也应该返回401表示解析失败,如果这些判断条件都完成了,那就说明这条请求时没有问题的就可以放行了。