2015-10-16 69 views
17

我在web應用工作包括UI的角度,服務器的Java,RestEasy的3.0.9.Final休息API調用否「訪問控制允許來源」標頭出現在所請求的資源 - RestEasy的

當我試圖訪問從另一個域中的其他服務我得到以下錯誤

無法加載迴應預檢要求未通過訪問控制檢查:沒有「訪問控制允許來源」標頭出現在請求的資源。因此不允許訪問原產地'http://localhost:8080'。

我配置我的服務器端與跨域調用作出反應,這正與GET呼叫,但POST調用正在創建錯誤

的web.xml

<context-param> 
    <param-name>resteasy.providers</param-name> 
    <param-value>com.test.sample.app.CorsFeature</param-value> 
</context-param> 

<listener> 
    <listener-class> 
     org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap</listener-class> 
</listener> 


<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 

<servlet> 
    <servlet-name>resteasy-servlet</servlet-name> 
    <servlet-class> 
     org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class> 
    <init-param> 
     <param-name>javax.ws.rs.Application</param-name> 
     <param-value>com.test.sample.app.Application</param-value> 
    </init-param> 
</servlet> 

<servlet-mapping> 
    <servlet-name>resteasy-servlet</servlet-name> 
    <url-pattern>/rest/*</url-pattern> 
</servlet-mapping> 

<context-param> 
    <param-name>resteasy.servlet.mapping.prefix</param-name> 
    <param-value>/rest</param-value> 
</context-param> 
<context-param> 
    <param-name>resteasy.scan</param-name> 
    <param-value>true</param-value> 
</context-param> 

服務類

@GET 
@Path("/getnameAtt") 
@Produces(MediaType.APPLICATION_JSON) 
public Response getHostnameAttributes() { 
return Response 
.status(200) 
.header("Access-Control-Allow-Origin", "*") 
.header("Access-Control-Allow-Headers", 
     "origin, content-type, accept, authorization") 
.header("Access-Control-Allow-Credentials", "true") 
.header("Access-Control-Allow-Methods", 
     "GET, POST, PUT, DELETE, OPTIONS, HEAD") 
.header("Access-Control-Max-Age", "1209600") 
.entity(new TestImpl().getHostNameAttributes()) 
.build(); 
} 

@POST 
@Path("/getSeq") 
@Produces(MediaType.APPLICATION_JSON) 
public Response getCurrentSequence(String request) { 
return Response 
.status(200) 
.header("Access-Control-Allow-Origin", "*") 
.header("Access-Control-Allow-Headers", 
     "origin, content-type, accept, authorization") 
.header("Access-Control-Allow-Credentials", "true") 
.header("Access-Control-Allow-Methods", 
     "GET, POST, PUT, DELETE, OPTIONS, HEAD") 
.header("Access-Control-Max-Age", "1209600") 
.entity(new TestImpl().getCurrentSeq(request)) 
.build(); 
} 

由於我是新來的restea系統無法弄清楚爲什麼這不起作用。 任何幫助將不勝感激。等待你的答覆。

謝謝

回答

8

您的資源方法不會被擊中,所以他們的標題永遠不會被設置。原因是在實際請求之前存在所謂的預檢請求,這是一個OPTIONS請求。所以錯誤來自預檢請求不會產生必要的標題的事實。

對於RESTeasy,您應該使用CorsFilter。有關示例,您可以看到here如何配置它。該過濾器將處理預檢請求。所以你可以刪除你的資源方法中的所有頭文件。

另請參見:

+0

感謝您的回覆。使用過CorsFilter並用@Provider註釋。但是那個班甚至沒有打電話。我是否需要在web.xml中添加任何內容 – user3595995

+0

如果您正在掃描資源,那麼我鏈接的示例就是用於此目的。如果你明確地註冊了所有的資源和提供者,那麼你可以在'Application'類中註冊'CorsFilter'。或者註冊「特徵」。無論哪種方式工作。雖然「特徵」不是必需的。如果預檢請求是顯式的,還是由瀏覽器在內部處理,那麼您可以在'Application'類 –

+0

中將'CorsFilter'註冊到'getSingletons()'的重寫中?在發送實際請求之前,是否必須先發送OPTION預檢請求?我被困在類似的錯誤。 –

0

看來你的資源POST方法不會被打到的@peeskillet提。很可能你的〜POST〜請求不起作用,因爲它可能不是一個簡單的請求。唯一簡單的請求是GET,HEAD或POST,並且請求頭是簡單的(唯一的簡單頭文件是Accept,Accept-Language,Content-Language,Content-Type = application/x-www-form-urlencoded,multipart/form-data ,text/plain)。

由於您已將Access-Control-Allow-Origin標題添加到您的回覆中,因此您可以將新的OPTIONS方法添加到您的資源類中。

@OPTIONS 
@Path("{path : .*}") 
public Response options() { 
    return Response.ok("") 
      .header("Access-Control-Allow-Origin", "*") 
      .header("Access-Control-Allow-Headers", "origin, content-type, accept, authorization") 
      .header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD") 
      .header("Access-Control-Max-Age", "2000") 
      .build(); 
} 
相關問題