1.导入依赖,注册中心和网关的依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
2.修改配置文件
server: port: 6001 spring: application: name: leadnews-admin-gateway cloud: nacos: discovery: server-addr: 127.0.0.1:8848 gateway: globalcors: cors-configurations: '[/**]': # 匹配所有请求 allowedOrigins: "*" #跨域处理 允许所有的域 allowedMethods: # 支持的方法 - GET - POST - PUT - DELETE routes: # 平台管理 - id: admin uri: lb://leadnews-admin predicates: - Path=/admin/** filters: - StripPrefix= 1 - id: user uri: lb://leadnews-user #service-id predicates: - Path=/user/** #路由映射 filters: - StripPrefix= 1
3.设置过滤器
@Slf4j
@Component
@Order(-1)
public class AuthenFilter implements GlobalFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
ServerHttpResponse response = exchange.getResponse();
String path = request.getURI().getPath();
if (path.contains("/login/in")){
return chain.filter(exchange);
}
String token = response.getHeaders().getFirst("token");
if (StringUtils.isBlank(token)){
response.setStatusCode(HttpStatus.UNAUTHORIZED);
return response.setComplete();
}
try {
Payload payload = JwtUtils.getInfoFromToken(token);
Integer userId = payload.getUserId();
ServerHttpRequest request1 = request.mutate()
.header("userId", userId.toString())
.build();
exchange.mutate().request(request1);
} catch (Exception e) {
response.setStatusCode(HttpStatus.UNAUTHORIZED);
return response.setComplete();
}
return chain.filter(exchange);
}
}
4.如果是全局过滤器,编写过滤逻辑
@Slf4j @Component @Order(-1) public class AuthenFilter implements GlobalFilter { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { ServerHttpRequest request = exchange.getRequest(); ServerHttpResponse response = exchange.getResponse(); String path = request.getURI().getPath(); if (path.contains("/login/in")){ return chain.filter(exchange); } String token = response.getHeaders().getFirst("token"); if (StringUtils.isBlank(token)){ response.setStatusCode(HttpStatus.UNAUTHORIZED); return response.setComplete(); } try { Payload payload = JwtUtils.getInfoFromToken(token); Integer userId = payload.getUserId(); ServerHttpRequest request1 = request.mutate() .header("userId", userId.toString()) .build(); exchange.mutate().request(request1); } catch (Exception e) { response.setStatusCode(HttpStatus.UNAUTHORIZED); return response.setComplete(); } return chain.filter(exchange); } }
5.启动nacos,启动网关