创建Maven项目并引入依赖
< dependency>
< groupId> com.alibaba.cloud< /groupId>
< artifactId> spring-cloud-starter-alibaba-nacos-discovery< /artifactId>
< /dependency>
< dependency>
< groupId> org.springframework.cloud< /groupId>
< artifactId> spring-cloud-starter-gateway< /artifactId>
< /dependency>
增加SpringBoot项目启动类
@SpringBootApplication
public class GatewayApplication {
public static void main( String[ ] args) {
SpringApplication.run( GatewayApplication.class, args) ;
}
}
编写配置文件
server:
port: 10010
spring:
application:
name: gateway
cloud:
nacos:
server-addr: http://localhost:8848
discovery:
cluster-name: BeiJing
gateway:
routes:
- id: user-service
uri: lb://userservice
predicates:
- Path = /user/**
- id: order-service
uri: lb://orderservice
predicates:
- Path = /order/**
default-filters:
- AddRequestHeader = newHeader, thisIsNewHeaderValue
编写全局过滤器,类似于AOP
// order的值越小,优先级反而越高,越先执行
@Order( -1)
@Component
public class AuthorizeFilter implements GlobalFilter {
@Override
public Mono< Void> filter( ServerWebExchange exchange, GatewayFilterChain chain) {
// 1 .获取请求参数
ServerHttpRequest request = exchange.getRequest( ) ;
MultiValueMap< String, String> queryParams = request.getQueryParams( ) ;
//获取token
String token = queryParams.getFirst( "token" ) ;
if ( "niceToken" .equals( token)) {
//放行
return chain.filter( exchange) ;
}
//不满足条件的token拦截
//设置状态码
exchange.getResponse( ) .setStatusCode( HttpStatus.UNAUTHORIZED) ;
//拦截请求
return exchange.getResponse( ) .setComplete( ) ;
}
}
编写跨域许可类
@Configuration
public class GwCorsFilter {
@Bean
public CorsWebFilter corsFilter ( ) {
CorsConfiguration config = new CorsConfiguration( ) ;
config.setAllowCredentials( true) ; // 允许cookies跨域
config.addAllowedOrigin( "*" ) ; //
config.addAllowedHeader( "*" ) ; //
config.setMaxAge( 18000L) ; // 预检请求的缓存时间(秒),即在这个时间段里,对于相同的跨域请求不会再预检了
config.addAllowedMethod( "OPTIONS" ) ; // 允许提交请求的方法类型,*表示全部允许
config.addAllowedMethod( "HEAD" ) ;
config.addAllowedMethod( "GET" ) ;
config.addAllowedMethod( "PUT" ) ;
config.addAllowedMethod( "POST" ) ;
config.addAllowedMethod( "DELETE" ) ;
config.addAllowedMethod( "PATCH" ) ;
org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource source =
new org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource( new PathPatternParser( )) ;
source.registerCorsConfiguration( "/**" , config) ;
return new CorsWebFilter( source) ;
}
}