token拦截器

@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表示解析失败,如果这些判断条件都完成了,那就说明这条请求时没有问题的就可以放行了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值