我無法讓我的應用程序運行。我整天都在讀這些東西,嘗試了一堆東西,但最終沒有任何工作。在最後一次嘗試中,我嘗試了這個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'因此不被允許訪問。「
我應該在客戶端加入這兩個標頭值,打電話給我的後端時:
- 訪問控制請求法
- 訪問控制請求報頭
那麼,你爲什麼要進行跨域調用? CORS頭與客戶端無關,服務器需要添加它們。 – epascarello
'REST風格的Web服務,沒有像Jersey或RESTeasy這樣的額外框架' - 你確定嗎?見:http://stackoverflow.com/tags/jax-rs/info –
對不起,你是對的,我用的javax: 的javax 的JavaEE-API 7.0 中提供 我的maven pom.xml文件。是的,我也從我讀的東西中想到,CORS頭必須僅在服務器端@epascarello上實現。只是發生了,我遵循另一個示例並以編程方式添加了這些值。但據我瞭解,他們應該已經通過瀏覽器創建。 –