【问题标题】: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 中。

现在,我不会分享任何与应用程序相关的代码,只是因为如果核心出现问题,它就不会在其他浏览器中运行,不是吗?但如果任何代码应该共享,请说出来,所以我会分享。但现在,我什至不知道出了什么问题。先谢谢了。

【问题讨论】:

    标签: spring spring-boot cors fetch 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。"
      猜你喜欢
      • 2021-04-28
      • 2016-07-10
      • 1970-01-01
      • 2022-08-08
      • 2013-12-11
      • 1970-01-01
      • 2017-12-01
      • 2016-08-12
      • 1970-01-01
      相关资源
      最近更新 更多