package com.thhy.gateway.config;
|
|
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.JSONObject;
|
import com.alibaba.nacos.shaded.io.grpc.netty.shaded.io.netty.util.internal.StringUtil;
|
import com.thhy.general.common.BasicResult;
|
import com.thhy.general.common.BasicStatus;
|
import org.redisson.api.RBucket;
|
import org.redisson.api.RedissonClient;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
|
import org.springframework.cloud.gateway.filter.GlobalFilter;
|
import org.springframework.core.Ordered;
|
import org.springframework.core.io.buffer.DataBuffer;
|
import org.springframework.http.HttpHeaders;
|
import org.springframework.http.HttpMethod;
|
import org.springframework.http.HttpStatus;
|
import org.springframework.http.server.reactive.ServerHttpRequest;
|
import org.springframework.http.server.reactive.ServerHttpResponse;
|
import org.springframework.web.server.ServerWebExchange;
|
import reactor.core.publisher.Mono;
|
|
import java.nio.charset.StandardCharsets;
|
|
public class GlobalFilters implements GlobalFilter, Ordered {
|
|
@Autowired
|
private ExcludeRoute excludeRoute;
|
|
@Autowired
|
private RedissonClient redissonClient;
|
|
@Value("${global.keyPrefix}")
|
private String keyPrefix;
|
|
private static final String ALL = "*";
|
private static final String MAX_AGE = "18000L";
|
|
@Override
|
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
|
exchange.getLogPrefix();
|
System.out.println("这是全局");
|
ServerHttpRequest request = exchange.getRequest();
|
String path = request.getPath().toString();
|
System.out.println("访问路径"+path);
|
ServerHttpResponse response = exchange.getResponse();
|
HttpHeaders headers = response.getHeaders();
|
headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN, "*");
|
headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS, "POST, GET, PUT, OPTIONS, DELETE, PATCH");
|
headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS, "true");
|
headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_HEADERS, "*");
|
headers.add("MultipleAllowOriginValues","*");
|
headers.add(HttpHeaders.ACCESS_CONTROL_EXPOSE_HEADERS, ALL);
|
headers.add(HttpHeaders.ACCESS_CONTROL_MAX_AGE, MAX_AGE);
|
if (request.getMethod() == HttpMethod.OPTIONS) {
|
response.setStatusCode(HttpStatus.OK);
|
return Mono.empty();
|
}
|
|
|
String[] excludeurls = excludeRoute.getExcludeurls();
|
|
for(String excludeurl : excludeurls){
|
if(path.equals(excludeurl)||path.contains(excludeurl)){
|
return chain.filter(exchange);
|
}
|
}
|
|
if(!request.getHeaders().containsKey("usertoken")){
|
BasicResult basicResult = new BasicResult(false, BasicStatus.TOKEN_IS_NULL); //请登录
|
return buildReturnMono(JSON.toJSONString(basicResult),exchange);
|
}
|
|
String userToken = request.getHeaders().get("usertoken").get(0);
|
|
Object obj = getUserInfo(userToken,exchange);
|
if(obj==null){
|
BasicResult basicResult = new BasicResult(false, BasicStatus.LOGIN_INFO_IS_ERROR); //登录信息异常
|
return buildReturnMono(JSON.toJSONString(basicResult),exchange);
|
}
|
JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(obj));
|
if(!jsonObject.containsKey("userId")||StringUtil.isNullOrEmpty(jsonObject.getString("userId"))){
|
BasicResult basicResult = new BasicResult(false, BasicStatus.LOGIN_INFO_IS_ERROR); //登录信息异常
|
return buildReturnMono(JSON.toJSONString(basicResult),exchange);
|
//throw new BasicException(BasicStatus.LOGIN_INFO_IS_ERROR);
|
}
|
//BodyHandlerServerHttpResponseDecorator responseDecorator = new BodyHandlerServerHttpResponseDecorator(bodyHandler, exchange.getResponse());
|
return chain.filter(exchange);
|
|
}
|
|
public static Mono<Void> buildReturnMono(String jsonStr, ServerWebExchange exchange) {
|
ServerHttpResponse response = exchange.getResponse();
|
byte[] bits = jsonStr.getBytes(StandardCharsets.UTF_8);
|
DataBuffer buffer = response.bufferFactory().wrap(bits);
|
response.setStatusCode(HttpStatus.OK);
|
HttpHeaders headers = response.getHeaders();
|
headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN, "*");
|
headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS, "POST, GET, PUT, OPTIONS, DELETE, PATCH");
|
headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS, "true");
|
headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_HEADERS, "*");
|
headers.add(HttpHeaders.ACCESS_CONTROL_EXPOSE_HEADERS, ALL);
|
headers.add(HttpHeaders.ACCESS_CONTROL_MAX_AGE, MAX_AGE);
|
//指定编码,否则在浏览器中会中文乱码
|
response.getHeaders().add("Content-Type", "text/plain;charset=UTF-8");
|
return response.writeWith(Mono.just(buffer));
|
}
|
|
public Object getUserInfo(String token,ServerWebExchange exchange){
|
RBucket<Object> rBucket = redissonClient.getBucket(keyPrefix+":usertoken:"+ token);
|
Object obj = rBucket.get();
|
return obj;
|
}
|
|
@Override
|
public int getOrder() {
|
return 0;
|
}
|
}
|