【问题标题】:Invalid CORS request in SpringSpring中无效的CORS请求
【发布时间】:2017-05-25 23:36:45
【问题描述】:

我正在尝试启用某些 IP 来访问特定方法。

@Override
public void addCorsMappings(CorsRegistry registry) {
    registry.addMapping("/updateDetail")
    .allowedOrigins("127.0.0.1", "10.96.33.45")
    .allowedMethods("GET", "POST");
}

但是当我尝试调用相同的方法时,我收到了无效的 CORS 请求。谁能帮我解决这个问题?

【问题讨论】:

  • 分享确切的相关错误消息/堆栈跟踪。由于OPTIONS 方法不在允许列表中,因此进行中的请求本身很可能失败

标签: spring spring-boot cors


【解决方案1】:

org.springframework.web.cors.DefaultCorsProcessor什么时候返回“无效的CORS请求”

  1. Spring 配置为使用 CORS 和
  2. 浏览器随请求发送“Origin”标头,但它与您的服务器域/端口/方案不匹配,并且
  3. 响应没有“Access-Control-Allow-Origin”标头和
  4. 请求不是预检请求。

如果您不需要 CORS,请在 WebSecurityConfigurerAdapter#configure(HttpSecurity http) 的实现中调用 cors().disable()(可能还有其他方法可以做到这一点,例如,如果您使用 Spring Boot )。

或者您可以使用例如将“Access-Control-Allow-Origin”标头添加到您的响应中org.springframework.web.cors.CorsConfigurationaddCorsMappings (就像你做的那样,但也许你应该添加更多方法或 url 或 IP 不匹配?)。

【讨论】:

    【解决方案2】:

    这门课就是你要找的:

    @Component
    @Order(Ordered.HIGHEST_PRECEDENCE)
    public class SimpleCorsFilter implements Filter {
    
    public SimpleCorsFilter() {
    }
    
    @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", "POST, GET, OPTIONS, DELETE, PUT");
        response.setHeader("Access-Control-Max-Age", "12000");
        response.setHeader("Access-Control-Allow-Headers", "Access-Control-Allow-Headers, Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With");
        response.setHeader("Access-Control-Expose-Headers", "*");
    
        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() {
    }
    }
    

    此过滤器将解决您所有的 cors 问题

    【讨论】:

      【解决方案3】:

      我这几天一直在调试这样的问题。实际问题是我的服务 uri 名称 /data 与 /daba 等有错字。这导致 SpringBoot 无法检索 CORS 配置(即使我有 /** 映射),因此 CORS-preflight 得到状态 403,这导致浏览器根本不发出实际请求 - 如果浏览器会触发请求,Spring 会返回“找不到资源”,然后我会更快地注意到错字。

      【讨论】:

        猜你喜欢
        • 2016-04-11
        • 1970-01-01
        • 2023-03-14
        • 1970-01-01
        • 2016-12-11
        • 1970-01-01
        • 1970-01-01
        • 2017-08-11
        • 2016-03-02
        相关资源
        最近更新 更多