请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,不允许来源“http://127.0.0.1:1111”访问

时间:2016-01-23 10:10:41

标签: javascript angularjs http tomcat

我有一种我无法理解的情况。两台计算机,其中一台我使用括号进行Web开发,另一台(Linux)我正在运行Tomcat(7)。两者都在同一个LAN内(因此地址范围相同)。我收到了标题中显示的错误,因此我完全被卡住了。尝试以下代码但没有成功:

var req = { url: l_url, method:"POST", headers: { 
                    'Content-Type': 'application/x-www-form-urlencoded' ,
    //                'Access-Control-Allow-Origin': '*',
                    'Access-Control-Allow-Origin': 'http://127.0.0.1',
                    'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS',
                    'Access-Control-Allow-Headers': 'Content-Type, application/x-www-form-urlencoded'
                    }, data: l_params } ;

$http(req).
            success(function(data, status, headers, config) {
                console.log("DB_Services - Success; data is: " + JSON.stringify(data)) ;
                 l_deferred.resolve(data);
            }).
            error(function(data, status, headers, config) {
                console.log("DB_Services - Error: " + data) ;
                 l_deferred.reject(status);
            });
             return l_deferred.promise;

错误(Chrome控制台)显示为:Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://127.0.0.1:58275' is therefore not allowed access.

我的搜索结果(不确定它是否正确)Tomcat拒绝了请求,即使我包含了上面显示的标题详细信息。

我还发现可以告诉Tomcat允许请求,但不知道如何以及在何处配置它。

所以,我的问题是:

1)我的http请求是否正确措辞?

2)如何让Tomcat允许此请求?

提前感谢任何建议。

2 个答案:

答案 0 :(得分:1)

您可以尝试在服务器端的java代码中添加过滤器类,示例代码

public class CorsFilter extends OncePerRequestFilter {

@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
    response.addHeader("Access-Control-Allow-Origin", "*");
    if (request.getHeader("Access-Control-Request-Method") != null && "OPTIONS".equals(request.getMethod())) {
        //Add CORS "pre-flight" request
        response.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
         response.addHeader("Access-Control-Allow-Headers", "Authentication-token");
        response.addHeader("Access-Control-Allow-Headers", "Content-Type");
        response.addHeader("Access-Control-Max-Age", "3600");
    }
    filterChain.doFilter(request, response);
}

}

将其添加到web.xml

<filter>
    <filter-name>cors</filter-name>
    <filter-class>location.of.filter.class</filter-class>
</filter>
<filter-mapping>
    <filter-name>cors</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

并在你的角度js app配置中尝试添加

app.config(['$httpProvider', function($httpProvider) {
    $httpProvider.defaults.useXDomain = true;
    delete $httpProvider.defaults.headers.common['X-Requested-With'];
}]);

这解决了我的问题,希望它也能帮到你。

答案 1 :(得分:0)

您正在遇到所谓的Same-Origin Policy。此策略背后的核心动机之一是防止您没有编写(因而不受信任)的脚本在页面上运行(并可能从中获取数据)。试图恶意行事的脚本正在执行所谓的Cross-Site Scripting

为了不违反同源政策,您的网站只能要求提供以下脚本:

  1. 与您的网站具有相同协议的网站
  2. 与您的网站具有相同主机名的网站
  3. 与您的网站具有相同端口的网站
  4. 您会注意到这基本上只代表您的网站。

    解决此限制的一种新方法是使用Cross-Origin Resource Sharing (CORS)。为此,您必须控制要运行的所有脚本的代码/服务器。

    为了帮助您入门,我们已经有了很好的问题/答案:Ways to circumvent the same-origin policy