一、整合到项目
添加依赖:
<!-- 网关 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
添加配置文件:
server:
port: 80
logging:
level:
root: info
spring:
application:
name: service-gateway
# spring cloud
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
# feign超时配置
feign:
client:
config:
default:
connect-timeout: 600000
read-timeout: 600000
主启动类:
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
@ComponentScan({"com.atguigu.common","com.atguigu.srb.gateway"})
@EnableDiscoveryClient
@EnableFeignClients //服务远程调用
public class ServiceGatewayApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceGatewayApplication.class,args);
}
}
启动报错:
需要排除该依赖:
<dependency>
<groupId>com.atguigu</groupId>
<artifactId>guigu-common</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 排除依赖 -->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</exclusion>
</exclusions>
</dependency>
配置跨域过滤器:
/**
* 跨域过滤器
*/
@Configuration
public class CorsConfig {
// 配置跨域过滤器
@Bean
public CorsWebFilter corsWebFilter(){
// 创建CORS跨域配置对象
CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true); //是否允许携带cookie
config.addAllowedOrigin("*"); //可接受的域,是一个具体域名或者*(代表任意域名)
config.addAllowedHeader("*"); //允许携带的头
config.addAllowedMethod("*"); //允许访问的方式
// 创建一个基于URL的跨域配置源
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
// 注册跨域配置到所有路径
source.registerCorsConfiguration("/**", config);
return new CorsWebFilter(source);
}
}
配置路由:
spring:
application:
name: service-gateway
# spring cloud
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
gateway:
routes:
- id: service-core
uri: lb://service-core
predicates:
- Path=/*/core/**
- id: service-sms
uri: lb://service-sms
predicates:
- Path=/*/sms/**
- id: service-oss
uri: lb://service-oss
predicates:
- Path=/*/oss/**
报跨域错误:
二、配置网关统一鉴权
/**
* 全局过滤器
*/
@Component
public class AuthFilter implements GlobalFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
System.out.println("拦截所有请求");
ServerHttpRequest request = exchange.getRequest();
ServerHttpResponse response = exchange.getResponse();
URI uri = request.getURI();
RequestPath path = request.getPath();
MultiValueMap<String, HttpCookie> cookies = request.getCookies();
System.out.println("请求鉴权");
// 获取请求头中名为 token 的参数值
List<String> tokens = request.getHeaders().get("token");
// 如果 tokens 不为 null 且长度大于 0
if(null!=tokens&&tokens.size()>0){
// 获取 token 的值
String token = tokens.get(0);
System.out.println("需要进行鉴权的token:"+token);
// 判断 token 是否有效
boolean b = JwtUtils.checkToken(token);
if(b){
// 鉴权成功,将用户id传递给微服务
Long userId = JwtUtils.getUserId(token);
// 将用户 id 存入请求头
request.mutate().header("userId",userId.toString());
// 将修改后的请求对象存入交换对象
exchange.mutate().request(request);
}
}
// 继续执行后面的过滤器
return chain.filter(exchange);
}
}