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的过滤器
最新推荐文章于 2024-06-12 20:53:12 发布