簡體   English   中英

CORS angular js + restEasy on POST

[英]CORS angular js + restEasy on POST

我正在從我的angular js應用程序到使用RestEasy實現的RESTful API進行一些POST請求。
這種情況是我需要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控制台上的錯誤是:

請求的資源上不存在“ Access-Control-Allow-Origin”標頭

我的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上工作……任何人都知道為什么?

好吧,最后我來到了這種解決方法:
它與IE配合使用的原因是因為IE直接發送POST而不是先發送預檢請求以請求許可。
但是我仍然不知道為什么過濾器無法管理OPTIONS請求並默認發送過濾器中未描述的標頭(似乎僅在這種情況下覆蓋...也許是restEasy的事情.. 。)

因此,我在我的rest服務中創建了一個OPTIONS路徑,該路徑重寫了響應並使用響應標頭將標頭包含在響應中

如果有人以前遇到過這種情況,我仍在尋找一種干凈的方法。

我很幸運通過使用此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>

如果願意,還可以使用屬性文件來配置它。 該庫的工作原理很吸引人,為您提供了許多配置靈活性!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM