package org.jeecg.filter; import lombok.extern.slf4j.Slf4j; import org.springframework.cloud.gateway.filter.GatewayFilterChain; import org.springframework.cloud.gateway.filter.GlobalFilter; import org.springframework.core.Ordered; import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; import org.springframework.web.server.ServerWebExchange; import reactor.core.publisher.Mono; import java.util.Arrays; import java.util.stream.Collectors; import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR; import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.addOriginalRequestUrl; /** * 全局拦截器,作用所有的微服务 * * 1.重写StripPrefix(获取真实的URL) * 2.将现在的request,添加当前身份 * @author: scott * @date: 2022/4/8 10:55 */ @Slf4j @Component public class GlobalAccessTokenFilter implements GlobalFilter, Ordered { public final static String X_ACCESS_TOKEN = "X-Access-Token"; public final static String X_GATEWAY_BASE_PATH = "X_GATEWAY_BASE_PATH"; @Override public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { String scheme = exchange.getRequest().getURI().getScheme(); String host = exchange.getRequest().getURI().getHost(); int port = exchange.getRequest().getURI().getPort(); String basePath = scheme + "://" + host + ":" + port; // 1. 重写StripPrefix(获取真实的URL) addOriginalRequestUrl(exchange, exchange.getRequest().getURI()); String rawPath = exchange.getRequest().getURI().getRawPath(); String newPath = "/" + Arrays.stream(StringUtils.tokenizeToStringArray(rawPath, "/")).skip(1L).collect(Collectors.joining("/")); ServerHttpRequest newRequest = exchange.getRequest().mutate().path(newPath).build(); exchange.getAttributes().put(GATEWAY_REQUEST_URL_ATTR, newRequest.getURI()); //2.将现在的request,添加当前身份 ServerHttpRequest mutableReq = exchange.getRequest().mutate().header("Authorization-UserName", "").header(X_GATEWAY_BASE_PATH,basePath).build(); ServerWebExchange mutableExchange = exchange.mutate().request(mutableReq).build(); return chain.filter(mutableExchange); } @Override public int getOrder() { return 0; } }