Java - Spring 启动:Access-Control-Allow-Origin 不工作
Java - Spring Boot: Access-Control- Allow-Origin not working
我尝试使用一些教程和 在 spring 引导中实现 Access-Control- Allow-Origin
,但无法实现。
为了实现这一点,我在 application.properties
文件中添加了下面的行
endpoints.cors.allowed-origins=https://example.com
这可能意味着除了URL https://example.com,没有其他端点可以调用任何API。但它不起作用我仍然可以在下图中看到 *
的响应。来自其他域的哪些 menas,我的 API 是可访问的。那么如何预防呢?
试试这个注解@Crossorigin("*") 在你的controller.You 可以根据你的需要改变注解中的参数
endpoints.cors.allowed-origins
for Spring boot 1 或 management.endpoints.web.cors.allowed-origins
for Spring boot 2 用于将 CORS 应用于执行器端点,它不适用于控制器端点定义。
实际上,默认情况下 Spring 引导不会设置任何 CORS headers。如果您看到 Access-Control-Allow-Origin
有一个值(例如通配符),则意味着您正在自己的代码中的某处配置它。验证您是否在控制器上使用 @CrossOrigin
,或者您使用的是某种 Filter
(例如 CorsFilter
)。
在 Spring 引导中全局配置 CORS 的一种方法是定义一个 CorsFilter
bean,例如:
@Bean
public CorsFilter corsFilter() {
final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
final CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true);
config.setAllowedOrigins(List.of("https://example.com"));
config.setAllowedHeaders(List.of("Origin", "Content-Type", "Accept"));
config.setAllowedMethods(List.of("GET", "POST", "PUT", "OPTIONS", "DELETE", "PATCH"));
source.registerCorsConfiguration("/**", config);
return new CorsFilter(source);
}
对于其他可能性,您可以检查this question。请注意,只有找出导致设置 Access-Control-Allow-Origin
的原因,这才会正常工作。
您可以像这样为您的项目定义自定义 cors 过滤器
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
@Component
public class CustomeCORSFilter implements Filter {
private final Logger log = LoggerFactory.getLogger(CustomeCORSFilter.class);
public CustomeCORSFilter() {
log.info("CustomeCORSFilter init");
}
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS,PUT, DELETE");
response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
response.setHeader("Access-Control-Max-Age", "");
response.setHeader("Access-Control-Allow-Headers", "Content-Type, Accept, X-Requested-With,");
chain.doFilter(request, response);
}
@Override
public void init(FilterConfig filterConfig) {
}
@Override
public void destroy() {
}
}
最后,我通过在我的应用程序中添加以下内容解决了这个问题 class。
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("https://example.com",
"https://www.example.com",
"http://192.168.1.12:3000",
"http://localhost:3000");
}
};
}
所以最终的应用程序 class 看起来类似于此
@SpringBootApplication
@EnableScheduling
@EnableAsync
public class ExampleApplication {
public static void main(String[] args) {
SpringApplication.run(ExampleApplication.class, args);
}
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("https://example.com",
"https://www.example.com",
"http://192.168.1.12:3000",
"http://localhost:3000");
}
};
}
}
我尝试使用一些教程和 Access-Control- Allow-Origin
,但无法实现。
为了实现这一点,我在 application.properties
文件中添加了下面的行
endpoints.cors.allowed-origins=https://example.com
这可能意味着除了URL https://example.com,没有其他端点可以调用任何API。但它不起作用我仍然可以在下图中看到 *
的响应。来自其他域的哪些 menas,我的 API 是可访问的。那么如何预防呢?
试试这个注解@Crossorigin("*") 在你的controller.You 可以根据你的需要改变注解中的参数
endpoints.cors.allowed-origins
for Spring boot 1 或 management.endpoints.web.cors.allowed-origins
for Spring boot 2 用于将 CORS 应用于执行器端点,它不适用于控制器端点定义。
实际上,默认情况下 Spring 引导不会设置任何 CORS headers。如果您看到 Access-Control-Allow-Origin
有一个值(例如通配符),则意味着您正在自己的代码中的某处配置它。验证您是否在控制器上使用 @CrossOrigin
,或者您使用的是某种 Filter
(例如 CorsFilter
)。
在 Spring 引导中全局配置 CORS 的一种方法是定义一个 CorsFilter
bean,例如:
@Bean
public CorsFilter corsFilter() {
final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
final CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true);
config.setAllowedOrigins(List.of("https://example.com"));
config.setAllowedHeaders(List.of("Origin", "Content-Type", "Accept"));
config.setAllowedMethods(List.of("GET", "POST", "PUT", "OPTIONS", "DELETE", "PATCH"));
source.registerCorsConfiguration("/**", config);
return new CorsFilter(source);
}
对于其他可能性,您可以检查this question。请注意,只有找出导致设置 Access-Control-Allow-Origin
的原因,这才会正常工作。
您可以像这样为您的项目定义自定义 cors 过滤器
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
@Component
public class CustomeCORSFilter implements Filter {
private final Logger log = LoggerFactory.getLogger(CustomeCORSFilter.class);
public CustomeCORSFilter() {
log.info("CustomeCORSFilter init");
}
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS,PUT, DELETE");
response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
response.setHeader("Access-Control-Max-Age", "");
response.setHeader("Access-Control-Allow-Headers", "Content-Type, Accept, X-Requested-With,");
chain.doFilter(request, response);
}
@Override
public void init(FilterConfig filterConfig) {
}
@Override
public void destroy() {
}
}
最后,我通过在我的应用程序中添加以下内容解决了这个问题 class。
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("https://example.com",
"https://www.example.com",
"http://192.168.1.12:3000",
"http://localhost:3000");
}
};
}
所以最终的应用程序 class 看起来类似于此
@SpringBootApplication
@EnableScheduling
@EnableAsync
public class ExampleApplication {
public static void main(String[] args) {
SpringApplication.run(ExampleApplication.class, args);
}
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("https://example.com",
"https://www.example.com",
"http://192.168.1.12:3000",
"http://localhost:3000");
}
};
}
}