解决Spring Cloud Gateway 请求跨域问题403 Forbidden
解释:
HTTP 403 Forbidden 错误表明客户端的请求已经被服务器接收,但服务器拒绝执行这个请求。在Spring Cloud Gateway的上下文中,这通常是因为请求是跨域的(CORS,Cross-Origin Resource Sharing),而服务器没有正确配置来允许跨域请求。
解决方法:
- 在Spring Cloud Gateway中添加一个全局的过滤器,用来处理CORS预检请求和实际请求。
@Bean
public CorsWebFilter corsFilter() {
CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true);
config.addAllowedOrigin("*"); // 允许任何源
config.addAllowedHeader("*"); // 允许任何头
config.addAllowedMethod("*"); // 允许任何方法
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", config);
return new CorsWebFilter(source);
}
- 如果你使用的是Spring Boot 2.4.0或更高版本,可以使用新的Spring Security支持来简化CORS配置:
@Bean
public WebFilter corsFilter() {
return (ServerWebExchange ctx, WebFilterChain chain) -> {
ServerHttpRequest request = ctx.getRequest();
if (CorsUtils.isCorsRequest(request)) {
HttpHeaders requestHeaders = request.getHeaders();
ServerHttpResponse response = ctx.getResponse();
HttpMethod requestMethod = requestHeaders.getAccessControlRequestMethod();
HttpHeaders headers = response.getHeaders();
headers.setAccessControlAllowOrigin(requestHeaders.getOrigin());
headers.setAccessControlAllowMethods(List.of(requestMethod.name()));
headers.setAccessControlAllowCredentials(true);
headers.setAccessControlAllowHeaders(List.of("Content-Type", "Authorization"));
headers.setAccessControlMaxAge(1800); // 30 min
if (request.getMethod() == HttpMethod.OPTIONS) {
response.setStatusCode(HttpStatus.OK);
return Mono.empty();
}
}
return chain.filter(ctx);
};
}
确保在配置中适当设置Access-Control-Allow-Origin
,如果需要指定特定的域,可以替换为实际的域地址。
以上代码段配合适当的Spring Cloud Gateway配置应该能够解决跨域问题,允许来自不同源的请求通过Spring Cloud Gateway。
评论已关闭