6-8 为gateway增加登录校验拦截器

首先在gateway的pom.xml文件下增加:

//hutool工具类   因为没传common类

   <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
        </dependency>

//  热部署

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>

在getway的config文件下生成LoginMemberFilter类(过滤器):  请求时带上token,返回时校验返回码是不是401

package com.jiawa.train.gateway.config;

import com.jiawa.train.gateway.util.JwtUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

/**
 * 功能描述
 *
 * @author ayyy
 * @date 2024/01/28  16:32
 */
@Component
public class LoginMemberFilter  implements GlobalFilter , Ordered {
    private static final Logger LOG = LoggerFactory.getLogger(LoginMemberFilter.class);


    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        String path = exchange.getRequest().getURI().getPath();
//        排除不需要拦截的请求
        if (path.contains("/admin")
                || path.contains("/hello")
                || path.contains("/member/member/login")
                || path.contains("/member/member/send-code")){
            LOG.info("不需要登录验证:{}",path);
            return chain.filter(exchange);
        }else {
            LOG.info("需要登录验证:{}",path);
        }
//        获取header的token参数
        String token = exchange.getRequest().getHeaders().getFirst("token");
        LOG.info("会员登录验证开始,token:{}", token);
        if (token == null || token.isEmpty()){
            LOG.info("token为空,请求被拦截");
//             设置成401错误
            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
//            中断请求
            return exchange.getResponse().setComplete();
        }
//          校验token是否有效,包括token是否被改过,是否过期
        boolean validate = JwtUtil.validate(token);
        if (validate){
            LOG.info("token有效,放行该请求 ");
            return chain.filter(exchange);
        }else {
            LOG.info("token无效,请求被拦截");
            //             设置成401错误
            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
//            中断请求
            return exchange.getResponse().setComplete();
        }
    }

    @Override
    public int getOrder() {
        return 0;
    }
}

修改jwtUtil类:

public static boolean validate(String token) {
    LOG.info("开始JWT token校验,token:{}", token);
    GlobalBouncyCastleProvider.setUseBouncyCastle(false);
    try {
        JWT jwt = JWTUtil.parseToken(token).setKey(key.getBytes());
        // validate包含了verify
        boolean validate = jwt.validate(0);
        LOG.info("JWT token校验结果:{}", validate);
        return validate;
    } catch (Exception e) {
        LOG.info("JWT token校验异常:{}", e);
       return false;
    }
}

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值