Spring 引导安全号 'Access-Control-Allow-Origin' header 出现在请求的资源错误上
Spring Boot Security No 'Access-Control-Allow-Origin' header is present on the requested resource Error
我正在构建具有 Spring 安全性的 Spring 启动应用程序。我有一个删除功能,它是通过 AJAX 请求使用 JavaScript 的 Fetch API 完成的。该功能在 Chrome 和 Firefox 中正常工作,但在 Opera 中会导致问题。正如我所提到的,控制台中显示“请求的资源上不存在 'Access-Control-Allow-Origin' header”错误。
我搜索了一下,是因为 CORS,浏览器通常不允许 AJAX 对不同来源的请求,但是删除请求在同一个域中,如果它在 Chrome/Firefox, 我想知道为什么它不在 Opera 中。
现在,我不会分享任何与应用程序相关的代码,只是因为如果核心出现问题,它就无法在其他浏览器中运行,不是吗?但如果需要共享任何代码,请说明,以便我共享。但是现在,我什至不知道出了什么问题。预先感谢。
您可以通过实施过滤器允许所有 header。
试试这个:
@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class CORSFilter implements Filter {
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) res;
HttpServletRequest request = (HttpServletRequest) req;
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "*");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "*");
//response.setHeader("Access-Control-Expose-Headers","yourCustomHeaderIfExist");
if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {
response.setStatus(HttpServletResponse.SC_OK);
} else {
chain.doFilter(req, res);
}
}
@Override
public void init(FilterConfig filterConfig) {
}
@Override
public void destroy() {
}
}
并在您的控制器前添加 @CrossOrigin
注释。
您也可以尝试添加这个 bean:
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurerAdapter() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**").allowedOrigins("*").allowedMethods("GET", "POST","PUT", "DELETE");
}
};
}
第 1 步:删除了代码中的所有 @CrossOrigin
第 2 步:转到应用程序 class 并使用以下代码更新它
import java.util.Arrays;
import java.util.Collections;
import java.util.stream.Collectors;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.http.HttpMethod;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
/**
*
* @author vaquar
*
*/
@SpringBootApplication
public class SpringbootApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootApplication.class, args);
}
@Bean
public CorsFilter corsFilter() {
final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
final CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true);
config.setAllowedOrigins(Collections.singletonList("*"));
config.setAllowedHeaders(Collections.singletonList("*"));
config.setAllowedMethods(Arrays.stream(HttpMethod.values()).map(HttpMethod::name).collect(Collectors.toList()));
source.registerCorsConfiguration("/**", config);
return new CorsFilter(source);
}
}
我正在构建具有 Spring 安全性的 Spring 启动应用程序。我有一个删除功能,它是通过 AJAX 请求使用 JavaScript 的 Fetch API 完成的。该功能在 Chrome 和 Firefox 中正常工作,但在 Opera 中会导致问题。正如我所提到的,控制台中显示“请求的资源上不存在 'Access-Control-Allow-Origin' header”错误。
我搜索了一下,是因为 CORS,浏览器通常不允许 AJAX 对不同来源的请求,但是删除请求在同一个域中,如果它在 Chrome/Firefox, 我想知道为什么它不在 Opera 中。
现在,我不会分享任何与应用程序相关的代码,只是因为如果核心出现问题,它就无法在其他浏览器中运行,不是吗?但如果需要共享任何代码,请说明,以便我共享。但是现在,我什至不知道出了什么问题。预先感谢。
您可以通过实施过滤器允许所有 header。
试试这个:
@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class CORSFilter implements Filter {
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) res;
HttpServletRequest request = (HttpServletRequest) req;
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "*");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "*");
//response.setHeader("Access-Control-Expose-Headers","yourCustomHeaderIfExist");
if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {
response.setStatus(HttpServletResponse.SC_OK);
} else {
chain.doFilter(req, res);
}
}
@Override
public void init(FilterConfig filterConfig) {
}
@Override
public void destroy() {
}
}
并在您的控制器前添加 @CrossOrigin
注释。
您也可以尝试添加这个 bean:
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurerAdapter() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**").allowedOrigins("*").allowedMethods("GET", "POST","PUT", "DELETE");
}
};
}
第 1 步:删除了代码中的所有 @CrossOrigin
第 2 步:转到应用程序 class 并使用以下代码更新它
import java.util.Arrays;
import java.util.Collections;
import java.util.stream.Collectors;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.http.HttpMethod;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
/**
*
* @author vaquar
*
*/
@SpringBootApplication
public class SpringbootApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootApplication.class, args);
}
@Bean
public CorsFilter corsFilter() {
final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
final CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true);
config.setAllowedOrigins(Collections.singletonList("*"));
config.setAllowedHeaders(Collections.singletonList("*"));
config.setAllowedMethods(Arrays.stream(HttpMethod.values()).map(HttpMethod::name).collect(Collectors.toList()));
source.registerCorsConfiguration("/**", config);
return new CorsFilter(source);
}
}