2016-03-05 24 views
0

我無法讓我的應用程序運行。我整天都在讀這些東西,嘗試了一堆東西,但最終沒有任何工作。在最後一次嘗試中,我嘗試了這個link。我將java後端作爲一個RESTful Web服務,沒有像Jersey或RESTeasy這樣的額外框架,只是純java。在那裏,我有我的登錄POST方法:由於CORS失敗的HTTP發佈請求

@POST 
@Path("login") 
@Produces(value = "application/json") 
public Response login() { 

    AccountAuthentificator authentificator = AccountAuthentificator.getInstance(); 
    Status status = Response.Status.OK; 

    String credentialValue = getHeaderValue(AccountAuthentificator.AUTH_CREDENTIALS); 
    if (credentialValue == null) { 
     status = Response.Status.FORBIDDEN; 
     return WebServiceUtil.createResponse(status, "Missing account credentials in header."); 
    } 

    try { 
     LoginResponse res = authentificator.login(credentialValue); 
     return WebServiceUtil.createResponse(status, res); 
    } catch (AccessControlException e) { 
     status = Response.Status.FORBIDDEN; 
     return WebServiceUtil.createResponse(status, 
       "User does not exist. Please verify your user name and password."); 
    } 
} 

的WebServiceUtil.createResponse方法基本上是增加必要的標頭,你可以在這裏看到:

public static Response createResponse(Status status, Object responseContent) { 

    ResponseBuilder resBuilder = Response.status(status.getStatusCode()); 

    resBuilder.header("Access-Control-Allow-Origin", "*"); 
    resBuilder.header("Access-Control-Allow-Methods", "GET, POST, OPTIONS"); 
    resBuilder.header("Access-Control-Allow-Credentials", "true"); 
    resBuilder.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Authorization"); 

    resBuilder.allow("OPTIONS"); 

    resBuilder.entity(getJSONAsString(responseContent)); 

    return resBuilder.build(); 
} 

我也看到人們用另一種方法。它帶有過濾器,如example。我也想知道我的實現是否與此不同,以及確定的前期準備工作是什麼 - 在我的實現中,它是.allow(「OPTIONS」)這樣做,但是你可以糾正我的錯誤。

然後我有我的web應用程序,我稱之爲POST方法。我正在使用AngularJS。在我的AuthenticateController控制器中,我有Login方法,它在登錄表單中被提交。執行如下所示:

function Login(username, password) { 
     // CreateLoginHeader creates the authorization token through the login values username and password 
     var authdata = CreateLoginHeader(username, password); 
     var config = { 
       withCredentials: true, 
       headers: { 'Authorization': authdata } 
     }; 
     $http.post('http://XXXX', config).then(SuccessLogin, ErrorLogin); 
    } 

有人知道這裏出了什麼問題嗎?通過Chrome開發人員工具,我可以看到我收到錯誤「XMLHttpRequest無法加載'placeholder-server-URL'。對預檢請求的響應未通過訪問控制檢查:沒有'Access-Control-Allow-Origin'標頭所請求的資源。原因'placeholder-client-URL'因此不被允許訪問。「

我應該在客戶端加入這兩個標頭值,打電話給我的後端時:

  • 訪問控制請求法
  • 訪問控制請求報頭
+0

那麼,你爲什麼要進行跨域調用? CORS頭與客戶端無關,服務器需要添加它們。 – epascarello

+0

'REST風格的Web服務,沒有像Jersey或RESTeasy這樣的額外框架' - 你確定嗎?見:http://stackoverflow.com/tags/jax-rs/info –

+0

對不起,你是對的,我用的javax: 的javax 的JavaEE-API 7.0 中提供 我的maven pom.xml文件。是的,我也從我讀的東西中想到,CORS頭必須僅在服務器端@epascarello上實現。只是發生了,我遵循另一個示例並以編程方式添加了這些值。但據我瞭解,他們應該已經通過瀏覽器創建。 –

回答

2

選項請求不由login處理,因此不調用createResponse

看一看:https://blogs.oracle.com/theaquarium/entry/supporting_cors_in_jax_rs(你應該實施javax.ws.rs.container.ContainerResponseFilter,見How to handle CORS using JAX-RS with Jersey

另一種可能性爲您的代碼在這裏(但如果你開發了一個「真正的」應用程序):添加@javax.ws.rs.OPTIONS到你的方法像你用@javax.ws.rs.POST做了。

+0

好的,我嘗試了這種方式,並且堅持教程[here](http://www.developerscrappad.com/1781/java/java-ee/rest-jax-rs/java-ee-7-jax- RS-2-0-CORS上休息,如何對做-REST的API訪問的-從-A-不同的域/)。我沒有做的唯一事情就是像他那樣改變web.xml文件。我擴展了Application類,並在那裏添加了我的類,其中包含所有已定義的post/get方法。我也使用過濾器的記錄器,似乎過濾器不會被請求和響應調用。任何想法爲什麼是這樣的情況? –

+0

基本上這是我的應用類: '@ApplicationPath( 「/ API/V1 /腦」) 公共類ApplicationConfig延伸申請{ \t \t 公共集> getClasses(){ \t \t設置> S =新HashSet >(); s.add(StudyManagerService.class); return s; } }' –

+0

嘗試像您的StudyManagerService一樣註冊過濾器(「提供者」)。 –