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;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章