Spring Boot Security No 'Access-Control-Allow-Origin' header is present on the requested resource Er
Posted
技术标签:
【中文标题】Spring Boot Security No \'Access-Control-Allow-Origin\' header is present on the requested resource Error【英文标题】:Spring Boot Security No 'Access-Control-Allow-Origin' header is present on the requested resource ErrorSpring Boot Security No 'Access-Control-Allow-Origin' header is present on the requested resource Error 【发布时间】:2019-01-18 23:45:28 【问题描述】:我正在使用 Spring Security 构建一个 Spring Boot 应用程序。我有一个使用 javascript 的 Fetch API 通过 AJAX 请求完成的删除功能。该功能在 Chrome 和 Firefox 中正常工作,但在 Opera 中会导致问题。正如我所提到的,控制台中显示了“请求的资源上不存在‘Access-Control-Allow-Origin’标头”错误。
我搜索了它,这是因为 CORS,浏览器通常不允许 AJAX 请求到不同的来源,但是删除请求在同一个域中,如果它在 Chrome/Firefox 中有效,我想知道为什么它不能t 在 Opera 中。
现在,我不会分享任何与应用程序相关的代码,只是因为如果核心出现问题,它就不会在其他浏览器中运行,不是吗?但如果任何代码应该共享,请说出来,所以我会分享。但现在,我什至不知道出了什么问题。先谢谢了。
【问题讨论】:
【参考方案1】:第 1 步:删除代码中的所有 @CrossOrigin
第 2 步:转到 Application 类并使用以下代码对其进行更新
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);
【讨论】:
【参考方案2】:您可以通过实现过滤器来允许您的所有标题。
试试这个:
@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");
;
【讨论】:
我应该在安全配置中的某处注册这个自定义过滤器吗? 但是,删除功能在 Opera 中仍然不起作用。这很奇怪。控制台错误消失了。但主要问题仍然存在。 访问控制允许方法。这里允许所有方法 我愿意。但奇怪的是,如果出现问题,它不应该在任何浏览器中工作,不是吗? 这是 Opera 控制台显示的内容,我什至不知道该网站:“无法加载 floxerz.com/p/…:请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,不允许访问源“localhost:5000”。响应的 HTTP 状态代码为 404。"以上是关于Spring Boot Security No 'Access-Control-Allow-Origin' header is present on the requested resource Er的主要内容,如果未能解决你的问题,请参考以下文章
Understand Spring Security Architecture and implement Spring Boot Security