所有请求都没有到gateway的GlobalFilter
JwtCheckFilter
@Component
public class JwtCheckFilter implements GlobalFilter, Ordered {
@Resource
private RedisTemplate redisTemplate ;
@Value("${no.require.urls:/admin/login,/user/gt/register,/user/login,/user/users/register,/user/sms/sendTo,/user/users/setPassword}")
private Set<String> noRequireTokenUris ;
/**
* 过滤器拦截到用户的请求后做啥
* @param exchange
* @param chain
* @return
*/
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
if(!isRequireToken(exchange)){
return chain.filter(exchange);
}
String token = getUserToken(exchange);
if(StringUtils.isEmpty(token)){
return buildeNoAuthorizationResult(exchange);
}
Boolean hasKey = redisTemplate.hasKey(token);
if(hasKey!=null && hasKey){
return chain.filter(exchange);
}
return buildeNoAuthorizationResult(exchange);
}
/**
*
* @param exchange
* @return
*/
private Mono<Void> buildeNoAuthorizationResult(ServerWebExchange exchange) {
ServerHttpResponse response = exchange.getResponse();
response.getHeaders().set("Content-Type","application/json");
response.setStatusCode(HttpStatus.UNAUTHORIZED) ;
JSONObject jsonObject = new JSONObject();
jsonObject.put("error","NoAuthorization") ;
jsonObject.put("errorMsg","Token is Null or Error") ;
DataBuffer wrap = response.bufferFactory().wrap(jsonObject.toJSONString().getBytes());
return response.writeWith(Flux.just(wrap)) ;
}
/**
*
* @param exchange
* @return
*/
private String getUserToken(ServerWebExchange exchange) {
String token = exchange.getRequest().getHeaders().getFirst(HttpHeaders.AUTHORIZATION);
return token == null ? null : token.replace("bearer ","") ;
}
/**
*
* @param exchange
* @return
*/
private boolean isRequireToken(ServerWebExchange exchange) {
String path = exchange.getRequest().getURI().getPath();
if(noRequireTokenUris.contains(path)){
return false ;
}
return Boolean.TRUE ;
}
/**
*
* @return
*/
@Override
public int getOrder() {
return 0;
}
}
application.yml
spring:
cloud:
nacos:
discovery:
server-addr: localhost:8848
loadbalancer:
cache:
enabled: true
caffeine:
spec: initialCapacity=500,expireAfterWrite=5s
gateway:
globalcors: # 全局的跨域处理
add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题
corsConfigurations:
'[/**]':
allowedOriginPattern: # 允许哪些网站的跨域请求
- "*"
allowedMethods: # 允许的跨域ajax的请求方式
- "GET"
- "POST"
- "DELETE"
- "PUT"
- "OPTIONS"
allowedHeaders: "*" # 允许在请求中携带的头信息
allowCredentials: true # 是否允许携带cookie
maxAge: 360000 # 这次跨域检测的有效期
discovery:
locator:
enabled: true
lowerCaseServiceId: true
routes:
- id: sys_route
uri: lb://crm-sys
predicates:
- Path=/user/**
application:
name: crm-gateway
redis:
host: localhost
port: 6379
server:
port: 8090
请求的服务
改过application.name;
order的执行顺序
所有请求能进GlobalFilter的filter方法
请求是否走了网关,其他服务和网关是不是在同一个namespace