一、微服务网关跨域问题
项目采用前后端分离架构,前段存在自己的前段系统,并且会单独部署,同样后端系统也都是单独部署,这样就一定存在跨域问题。可以在controller类上添加注解来进行解决,但是现在的访问都是基于网关进行操作,所以还需要在网关系统上对跨域问题进行解决。具体解决方案:在网关系统添加配置信息:
修改application.yml ,在spring.cloud.gateway节点添加配置:
globalcors:
cors-configurations:
'[/**]': # 匹配所有请求
allowedOrigins: "*" #跨域处理 允许所有的域
allowedMethods: # 支持的方法
- GET
- POST
- PUT
- DELETE
网关模块spring.cloud.gateway的配置文件application.yml如下:
spring:
application:
name: sysgateway
cloud:
gateway:
globalcors:
cors-configurations:
'[/**]': # 匹配所有请求
allowedOrigins: "*" #跨域处理 允许所有的域
allowedMethods: # 支持的方法
- GET
- POST
- PUT
- DELETE
routes:
- id: goods
uri: lb://goods
predicates:
- Path=/goods/**
filters:
- StripPrefix= 1
server:
port: 9101
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:6868/eureka
instance:
prefer-ip-address: true
二、微服务网关自定义过滤器
当有了网关系统,客户端所有访问先进入到网关中,由网关将请求转发到具体某个服务。基于这个特点,可以在网关上通过过滤器的形式进行特定业务的操作:比如ip(黑白名单)拦截、特定地址的拦截等。
定义两个过滤器 :获取客户端访问IP 和客户端访问URL地址:
(1)shangcheng_gateway_system创建IpFilter(获取客户端访问IP)
@Component
public class IpFilter implements GlobalFilter, Ordered {
//具体业务逻辑
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
System.out.println("经过第1个过滤器IpFilter");
ServerHttpRequest request = exchange.getRequest();
InetSocketAddress remoteAddress = request.getRemoteAddress();
System.out.println("ip:"+remoteAddress.getHostName());
return chain.filter(exchange);//放行过滤器
}
//过滤器的执行优先级
@Override
public int getOrder() {
return 1;
}
}
(2)shangcheng_gateway_system创建UrlFilter(获取客户端访问url地址)
@Component
public class UrlFilter implements GlobalFilter, Ordered {
//具体业务逻辑
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
System.out.println("经过第2个过滤器UrlFilter");
ServerHttpRequest request = exchange.getRequest();
String url = request.getURI().getPath();
System.out.println("url:"+url);
return chain.filter(exchange);//放行过滤器
}
//过滤器的执行优先级
@Override
public int getOrder() {
return 2;
}
}
三、网关访问路由转发测试
网关访问路由转发测试:
直接访问Goods微服务:localhost:9001/brand/category/手机
成功返回结果。
访问网关:localhost:9101/goods/brand/category/手机
成功返回结果。