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的主要内容,如果未能解决你的问题,请参考以下文章

Spring Security with Boot

spring boot Security 简单使用

Spring Boot Security

Understand Spring Security Architecture and implement Spring Boot Security

如何使用 Spring-Boot 播种 Spring-Security

Spring Boot整合Spring Security总结