“Access-Control-Allow-Origin”标头包含多个值“*、*”,但只允许一个。在 Chrome 和 Firefox 中

Posted

技术标签:

【中文标题】“Access-Control-Allow-Origin”标头包含多个值“*、*”,但只允许一个。在 Chrome 和 Firefox 中【英文标题】:The 'Access-Control-Allow-Origin' header contains multiple values '*, *', but only one is allowed. in Chrome and Firefox 【发布时间】:2015-03-02 07:32:40 【问题描述】:

我收到错误:“Access-Control-Allow-Origin”标头包含多个值“*、*”,但只允许一个值。当我从我的申请。

这不是 webapi 服务调用的问题,因为当我跟踪来自 fiddler 的调用时,我得到了 Result with 200 。但是即使在我得到 200 结果之后,来自 $http.post 的调用也会引发错误。我不知道为什么。它适用于 IE,但不适用于 Chrome 或 Firefox。

在 chrome 和 Firefox 中抛出我:XMLHttpRequest 无法加载 **url。 “Access-Control-Allow-Origin”标头包含多个值“*、*”,但只允许一个。 Origin url 因此不允许访问。**

请建议我需要在 Chrome 和 Firefox 中更改哪些设置来运行符文。

  $http.post(serviceBase + 'token', data,  headers:  'Content-Type': 'application/x-www-form-urlencoded'  ).success(function (response) 
            
            if (loginData.useRefreshTokens) 
                localStorageService.set('authorizationData',  token: response.access_token, userName: loginData.userName, refreshToken: response.refresh_token, useRefreshTokens: true );
            
            else 
                localStorageService.set('authorizationData',  token: response.access_token, userName: loginData.userName, refreshToken: "", useRefreshTokens: false );
            
            _authentication.isAuth = true;
            _authentication.userName = loginData.userName;
            _authentication.useRefreshTokens = loginData.useRefreshTokens;

            deferred.resolve(response);

        ).error(function (err, status) 
            _logOut();
            deferred.reject(err);
        );

【问题讨论】:

从服务器端,将标头设置为* 而不是*,* 感谢您的评论,但我可以知道怎么做吗? 我投票结束这个问题,因为它已经 6 年了,这是一个服务器端问题,我怀疑这些细节是否会在这个问题中提供。 【参考方案1】:

如果您使用 JAVA 作为后端服务,那么您可能需要对 HTTPRequest 应用 CORS 过滤器。您可以通过添加如下所示的 filterClass 来做到这一点......

    @Component
public class CorsFilter extends OncePerRequestFilter
    protected static  Logger logger = LoggerFactory.getLogger(CorsFilter.class);

    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
            throws ServletException, IOException 
         logger.info("entering FILTER page");

         if (request.getHeader("Access-Control-Request-Method") != null && "OPTIONS".equals(request.getMethod())) 
            // CORS "pre-flight" request
            response.addHeader("Access-Control-Allow-Origin", "*");
            response.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
            response.setHeader("Access-Control-Allow-Headers", "x-requested-with");
            response.addHeader("Access-Control-Max-Age", "1800");//30 min
        
        //This will filter your requests and responses.
        filterChain.doFilter(request, response);
    

 

【讨论】:

以上是关于“Access-Control-Allow-Origin”标头包含多个值“*、*”,但只允许一个。在 Chrome 和 Firefox 中的主要内容,如果未能解决你的问题,请参考以下文章

跨域问题的解决方案 php

WebApi开启CORS支持跨域POST

JIRA REST API cors

golang中http POST的预检问题

向 fwrite / fopen / fclose 进程添加内容头

如何使用 javascript/jquery/AJAX 调用 Django REST API?