可扩展应用程序的 CORS 问题

Posted

技术标签:

【中文标题】可扩展应用程序的 CORS 问题【英文标题】:CORS issue for Scalable application 【发布时间】:2015-12-01 21:59:53 【问题描述】:

我有三个应用程序,然后是 AngularJS 中的身份验证服务器、资源服务器和前端应用程序。 AngularJS 应用程序在节点服务器上运行,其他资源在 Tomcat 服务器上运行。通过使用 CORS 的 AngularJS,我能够登录到 authserver (http://localhost:8081/oauth/token),但我无法访问资源服务器 (http://localhost:8082/api/devices)。标题添加如下:

var config = 
    headers: 
        'Authorization': 'bearer '+authToken,
        'Accept': 'application/json;odata=verbose'
    
;
$http.get(RESOURCE_SERVER + 'api/devices',config).then(function(response)
    console.log(""+response.data);
);'''

标头未添加到资源服务器并获得诸如 CORS 问题之类的异常。我主要担心的是我能够登录到身份验证服务器但不能登录到资源服务器,为什么会这样?

@Component
public class SimpleCORSFilter implements Filter 

    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException 
        HttpServletResponse response = (HttpServletResponse) res;
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", "x-requested-with");
        chain.doFilter(req, res);
    

    public void init(FilterConfig filterConfig) 

    public void destroy() 

错误::XMLHttpRequest 无法加载 http://192.168.0.130:8080/golive-resource/api-docs。这 'Access-Control-Allow-Origin' 标头包含多个值 '*, *', 但只允许一个。因此,原点 'http://127.0.0.1:9000' 是 不允许访问。

【问题讨论】:

您的服务器是否发出 CORS 响应标头 有两个应用认证服务器和资源服务器,我可以登录认证服务器,资源服务器出现CORS问题。 我收到以下错误“Access-Control-Allow-Origin”标头包含多个值“*、*”,但只允许一个。 Origin '127.0.0.1:9000' 因此不允许访问。 那么你应该修复错误 我已经添加了CORS过滤器,还需要做什么? 【参考方案1】:

问题在于,在您的设置中的其他地方,您还设置了 Access-Control-Allow-Origin 标头,而不是一个覆盖另一个它们由服务器组合的,这意味着您最终会得到两个值。

此标头有两个值会导致错误。因此,您应该找出在哪里设置此标头,然后删除该实例或将其从上面的 sn-p 中删除。

【讨论】:

【参考方案2】:

实际上,浏览器使用 http 请求方法 "options" 在您的实际请求之前发出预检请求。所以你必须向这个请求发送 200 OK

if(httpRequest.getMethod().equals("OPTIONS"))
        httpResponse.setStatus(HttpServletResponse.SC_ACCEPTED);
        return;
    

您可以在http://enable-cors.org/找到更多信息

【讨论】:

以上是关于可扩展应用程序的 CORS 问题的主要内容,如果未能解决你的问题,请参考以下文章

如何解决无法通过浏览器扩展解决的 CORS 错误?

Firefox 扩展请求被解释为 CORS

Firefox扩展请求被解释为CORS

Chrome 扩展中的 CORS HTTPS 到 HTTP 网络服务

Domino、CORS 和 OPTIONS 请求

使用 CORS 的应用程序在 Azure 中不起作用