【问题标题】:CORS Error on ChromeChrome 上的 CORS 错误
【发布时间】:2016-11-15 00:16:06
【问题描述】:

我没有看到自己发出跨域 AJAX 请求。但是,我仍然收到与 CROSS 相关的错误。这只发生在 Chrome 上。 Firefox 和 Safari 运行良好。

错误: “对预检请求的响应未通过访问控制检查:请求的资源上不存在 'Access-Control-Allow-Origin' 标头。”

设置是:

  1. AngularJS SPA
  2. Nginx 提供静态 Web 内容并作为反向代理将 https AJAX 请求作为 http 请求转发到本地 jettty/spring 应用程序
  3. 作为 Spring 应用程序的一部分公开的 API 使用 shiro 库进行保护

常规

Request URL:https://domainName.com/api/path
Request Method:OPTIONS
Status Code:401 

请求标头

:authority:domainName.com
:method:OPTIONS
:path:/api/path
:scheme:https
accept:*/*
accept-encoding:gzip, deflate, sdch, br
accept-language:en-US,en;q=0.8
access-control-request-headers:accept, authorization, content-type
access-control-request-method:POST
origin:https://www.domainName.com

响应标头:

content-length:0
date:Tue, 12 Jul 2016
server:nginx
status:401
www-authenticate:BASIC realm="application"

对 CORS 错误有任何想法吗?

【问题讨论】:

    标签: nginx cors jetty shiro preflight


    【解决方案1】:

    这基本上是由于 Chrome 发出的飞行前 Op OPTIONS 请求。有时可能很烦人。最好使用一个名为 Xdomain 的库,它是 CORS 的替代品。它也有 Angular JS 包装器。对于此类问题,它确实是一个优雅的解决方案。看看https://github.com/jpillora/xdomain。让我知道这是否对您有帮助:)。

    【讨论】:

    • 感谢您的回答!最终我转向了后端服务器 cors 过滤器解决方案
    【解决方案2】:

    最后,我通过为码头服务器提供一个跨域过滤器配置类,在后端解决了这个问题。下面是一些示例代码:

    DispatcherServlet dS = new DispatcherServlet();
    dS.setContextClass(AnnotationConfigWebApplicationContext.class);
    dS.setContextConfigLocation(String.format("%s",ApplicationConfig.class.getCanonicalName()));
    
    
    final ServletHolder servletHolder = new ServletHolder(dS);
    final ServletContextHandler context = new ServletContextHandler();
    context.setContextPath("/");
    context.addServlet(servletHolder, "/");
    
    // cors
    {
    
    FilterHolder h = new FilterHolder(CrossOriginFilter.class);
    h.setInitParameter(CrossOriginFilter.ALLOWED_ORIGINS_PARAM,"https://*.domainName");
    h.setInitParameter(CrossOriginFilter.ALLOWED_METHODS_PARAM,"GET,POST,HEAD,OPTIONS");
    h.setInitParameter(CrossOriginFilter.ALLOWED_HEADERS_PARAM,"*");
    h.setInitParameter(CrossOriginFilter.PREFLIGHT_MAX_AGE_PARAM,"300");
    h.setInitParameter(CrossOriginFilter.ALLOW_CREDENTIALS_PARAM,"true");
    h.setInitParameter(CrossOriginFilter.EXPOSED_HEADERS_PARAM,"");
    h.setInitParameter(CrossOriginFilter.CHAIN_PREFLIGHT_PARAM,"false");
    h.setInitParameter(CrossOriginFilter.ALLOWED_TIMING_ORIGINS_PARAM,"https://*.domainName");
    context.addFilter(h,"/*",EnumSet.of(DispatcherType.REQUEST));
    
    }
    

    【讨论】:

      猜你喜欢
      • 2014-11-29
      • 2017-12-08
      • 1970-01-01
      • 2017-01-02
      • 2014-10-27
      • 2013-06-15
      • 2018-08-24
      • 1970-01-01
      • 2019-10-17
      相关资源
      最近更新 更多