| package com.ruoyi.gateway.config; | 
|   | 
| import org.springframework.beans.factory.annotation.Autowired; | 
| import org.springframework.context.annotation.Bean; | 
| import org.springframework.context.annotation.Configuration; | 
| import org.springframework.http.HttpHeaders; | 
| import org.springframework.http.HttpMethod; | 
| import org.springframework.http.HttpStatus; | 
| import org.springframework.http.MediaType; | 
| import org.springframework.http.server.reactive.ServerHttpRequest; | 
| import org.springframework.http.server.reactive.ServerHttpResponse; | 
| import org.springframework.web.cors.reactive.CorsUtils; | 
| import org.springframework.web.reactive.function.server.RequestPredicates; | 
| import org.springframework.web.reactive.function.server.RouterFunction; | 
| import org.springframework.web.reactive.function.server.RouterFunctions; | 
| import com.ruoyi.gateway.handler.ValidateCodeHandler; | 
| import org.springframework.web.server.ServerWebExchange; | 
| import org.springframework.web.server.WebFilter; | 
| import org.springframework.web.server.WebFilterChain; | 
| import reactor.core.publisher.Mono; | 
|   | 
| /** | 
|  * 路由配置信息 | 
|  *  | 
|  * @author ruoyi | 
|  */ | 
| @Configuration | 
| public class RouterFunctionConfiguration { | 
|   | 
|     /** | 
|      * 这里为支持的请求头,如果有自定义的header字段请自己添加 | 
|      */ | 
|     private static final String ALLOWED_HEADERS = "X-Requested-With, Content-Type, Authorization, credential, X-XSRF-TOKEN, token, username, client, request-origion, sign, nonce_str, timestamp"; | 
|     private static final String ALLOWED_METHODS = "GET,POST,PUT,DELETE,OPTIONS,HEAD"; | 
|     private static final String ALLOWED_ORIGIN = "*"; | 
|     private static final String ALLOWED_EXPOSE = "*"; | 
|     private static final String MAX_AGE = "18000L"; | 
|   | 
|     @Autowired | 
|     private ValidateCodeHandler validateCodeHandler; | 
|   | 
|     @SuppressWarnings("rawtypes") | 
|     @Bean | 
|     public RouterFunction routerFunction() { | 
|         return RouterFunctions.route( | 
|                 RequestPredicates.GET("/code").and(RequestPredicates.accept(MediaType.TEXT_PLAIN)), | 
|                 validateCodeHandler); | 
|     } | 
|   | 
|     /** | 
|      * 跨域配置 | 
|      */ | 
|     @Bean | 
|     public WebFilter corsFilter() { | 
|         return (ServerWebExchange ctx, WebFilterChain chain) -> { | 
|             ServerHttpRequest request = ctx.getRequest(); | 
|             if (CorsUtils.isCorsRequest(request)) { | 
|                 ServerHttpResponse response = ctx.getResponse(); | 
|                 HttpHeaders headers = response.getHeaders(); | 
|                 headers.add("Access-Control-Allow-Headers", ALLOWED_HEADERS); | 
|                 headers.add("Access-Control-Allow-Methods", ALLOWED_METHODS); | 
|                 headers.add("Access-Control-Allow-Origin", ALLOWED_ORIGIN); | 
|                 headers.add("Access-Control-Expose-Headers", ALLOWED_EXPOSE); | 
|                 headers.add("Access-Control-Max-Age", MAX_AGE); | 
|                 headers.add("Access-Control-Allow-Credentials", "true"); | 
|                 if (request.getMethod() == HttpMethod.OPTIONS) { | 
|                     response.setStatusCode(HttpStatus.OK); | 
|                     return Mono.empty(); | 
|                 } | 
|             } | 
|             return chain.filter(ctx); | 
|         }; | 
|     } | 
| } |