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