| | |
| | | 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.common.core.utils.StringUtils; |
| | | import com.ruoyi.gateway.handler.ValidateCodeHandler; |
| | | import org.springframework.web.server.ServerWebExchange; |
| | | import org.springframework.web.server.WebFilter; |
| | |
| | | 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-Expose-Headers", ALLOWED_EXPOSE); |
| | | headers.add("Access-Control-Max-Age", MAX_AGE); |
| | | String origin = request.getHeaders().getOrigin(); |
| | | if (StringUtils.isNotBlank(origin)) { |
| | | // 反射请求来源,支持携带凭据(Allow-Origin 为 * 时浏览器会拒绝 Allow-Credentials) |
| | | headers.add("Access-Control-Allow-Origin", origin); |
| | | headers.add("Vary", "Origin"); |
| | | headers.add("Access-Control-Allow-Credentials", "true"); |
| | | } |
| | | else { |
| | | headers.add("Access-Control-Allow-Origin", ALLOWED_ORIGIN); |
| | | } |
| | | // 所有跨域响应(含预检 OPTIONS)统一在提交前设置 CORS 头 |
| | | response.beforeCommit(() -> { |
| | | applyCorsHeaders(request, response); |
| | | return Mono.empty(); |
| | | }); |
| | | if (request.getMethod() == HttpMethod.OPTIONS) { |
| | | response.setStatusCode(HttpStatus.OK); |
| | | return Mono.empty(); |
| | |
| | | return chain.filter(ctx); |
| | | }; |
| | | } |
| | | |
| | | private void applyCorsHeaders(ServerHttpRequest request, ServerHttpResponse response) { |
| | | HttpHeaders headers = response.getHeaders(); |
| | | String origin = request.getHeaders().getOrigin(); |
| | | headers.set("Access-Control-Allow-Headers", ALLOWED_HEADERS); |
| | | headers.set("Access-Control-Allow-Methods", ALLOWED_METHODS); |
| | | headers.set("Access-Control-Expose-Headers", ALLOWED_EXPOSE); |
| | | headers.set("Access-Control-Max-Age", MAX_AGE); |
| | | if (origin != null) { |
| | | // 反射请求来源,支持携带凭据(Allow-Origin 为 * 时浏览器会拒绝 Allow-Credentials) |
| | | headers.set("Access-Control-Allow-Origin", origin); |
| | | headers.set("Access-Control-Allow-Credentials", "true"); |
| | | headers.set(HttpHeaders.VARY, HttpHeaders.ORIGIN); |
| | | } |
| | | else { |
| | | headers.set("Access-Control-Allow-Origin", "*"); |
| | | } |
| | | } |
| | | } |