gateway的过滤器

package com.xiaoxiaochuangye.erp.xxcygate.filter;

import com.xiaoxiaochuangye.erp.xxcygate.enums.RedisTokenEnum;
import com.xiaoxiaochuangye.erp.xxcygate.enums.RedisTopEnum;
import com.xiaoxiaochuangye.erp.xxcygate.utils.RedisUtil;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
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;

import java.net.URI;

/**
 * 全局过滤
 * spring 2020/3/23
 */
@Component("XxcyGlobalFilter")
public class XxcyGlobalFilter implements GlobalFilter, Ordered {
    private static final Logger logger = LoggerFactory.getLogger(XxcyGlobalFilter.class);

    @Autowired
    private RedisUtil redisUtil;


    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
//exchange.getRequest().mutate().header("a", "888").build();
        //请求的url资源部分
        URI requestUri = exchange.getRequest().getURI();


        //登录请求不做拦截
        if (requestUri.getPath().indexOf("/userInfo/login/userLoginGetToken") > -1) {
            return chain.filter(exchange);
        }
        //对非登录页面进行拦截
        if (requestUri.getPath().indexOf("/userInfo/login/userLoginGetToken") == -1) {
            String token = this.obtainToken(exchange);
            //判断token 是否存在
            if (StringUtils.isBlank(token)) {
                logger.error("token is null");
                exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
                return exchange.getResponse().setComplete();
            }
            //判断 token 是否过期
            if (redisUtil.hasKey(RedisTopEnum.REDIS_TOKEN_TOP.getKey() + token)) {
//                刷新token时间
                redisUtil.expire(RedisTopEnum.REDIS_TOKEN_TOP.getKey() + token, RedisTokenEnum.REDIS_TOKEN_TIME.getKey());
            } else {
                //token 过期
                exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
                return exchange.getResponse().setComplete();
            }
       }
        //调用chain.filter继续向下游执行
        return chain.filter(exchange);

    }

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

    private String obtainToken(ServerWebExchange exchange) {
        //先从header中获取
        String token = exchange.getRequest().getHeaders().getFirst(RedisTokenEnum.REDIS_TOKEN_NAME.getDesc());
        if (StringUtils.isNotBlank(token)) {
            return token;
        }
        //url
        token = exchange.getRequest().getQueryParams().getFirst(RedisTokenEnum.REDIS_TOKEN_NAME.getDesc());
        if (StringUtils.isNotBlank(token)) {
            return token;
        }
        //cookie
        token = exchange.getRequest().getCookies().getFirst(RedisTokenEnum.REDIS_TOKEN_NAME.getDesc()).getValue();
        if (StringUtils.isNotBlank(token)) {
            return token;
        }
        return null;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值