CORS角js + restEasy POST

时间:2014-04-03 22:10:01

标签: javascript angularjs resteasy

我从我的 angular js 应用程序做了一些 POST 请求到我的 RESTful API ,使用 RestEasy
情况是我需要 CORS 所以我添加了一个带有此代码的servlet过滤器:

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

但我无法弄清楚为什么它仅适用于 GET 请求,而不是 POST 请求,Chrome控制台上的错误是:< / p>

  

否&#39;访问控制 - 允许 - 来源&#39;标题出现在请求的上   资源

我的POST请求是:

$http({method: 'POST', 
       url: myUrl,
       data: $scope.data,
       headers: {'Content-Type': 'application/json'}
});  

这是我在POST时收到的回复:

Allow:POST, OPTIONS
Content-Length:0
Date:Thu, 03 Apr 2014 23:27:22 GMT
Server:Apache-Coyote/1.1

任何想法?谢谢!
修改
在IE10上测试过它可以工作,但是对于chrome和firefox都没有工作......任何人都知道为什么?

2 个答案:

答案 0 :(得分:1)

最后我来到了这个解决方法:
它与IE合作的原因是因为IE直接发送 POST 而不是首先请求许可的预检请求。
但我仍然不知道为什么过滤器无法管理 OPTIONS 请求,并默认发送过滤器中未描述的标题(似乎是覆盖对于那个唯一的案例......也许是一件令人安心的事情...)

所以我在我的休息服务中创建了一个 OPTIONS 路径,用于重写响应并使用响应头包含响应中的标题

  

如果有人面对这个问题,我仍然在寻找干净的方法   之前。

答案 1 :(得分:1)

我很幸运通过使用这个lib为我的API(在Wildfly上)配置跨源资源共享(CORS):

<dependency>
<groupId>com.thetransactioncompany</groupId>
<artifactId>cors-filter</artifactId>
<version>2.1</version>
</dependency>

设置起来非常简单。只需将上述依赖项添加到您的pom,然后将以下配置添加到web.xml文件的webapp部分。

<filter>
    <filter-name>CORS</filter-name>
    <filter-class>com.thetransactioncompany.cors.CORSFilter</filter-class>

    <init-param>
        <param-name>cors.allowGenericHttpRequests</param-name>
        <param-value>true</param-value>
    </init-param>

    <init-param>
        <param-name>cors.allowOrigin</param-name>
        <param-value>*</param-value>
    </init-param>

    <init-param>
        <param-name>cors.allowSubdomains</param-name>
        <param-value>false</param-value>
    </init-param>

    <init-param>
        <param-name>cors.supportedMethods</param-name>
        <param-value>GET, HEAD, POST, DELETE, OPTIONS</param-value>
    </init-param>

    <init-param>
        <param-name>cors.supportedHeaders</param-name>
        <param-value>*</param-value>
    </init-param>

    <init-param>
        <param-name>cors.supportsCredentials</param-name>
        <param-value>true</param-value>
    </init-param>

    <init-param>
        <param-name>cors.maxAge</param-name>
        <param-value>3600</param-value>
    </init-param>

</filter>

<filter-mapping>
    <!-- CORS Filter mapping -->
    <filter-name>CORS</filter-name>
    <url-pattern>*</url-pattern>
</filter-mapping>

如果您愿意,也可以使用属性文件对其进行配置。这个lib就像魅力一样,为你提供了很多配置灵活性!