[英]Failed HTTP post request because of CORS
我無法使我的應用程序運行。 我整天都在閱讀有關此內容的文章,嘗試了很多東西,但最終沒有任何效果。 在最后一次嘗試中,我嘗試了此鏈接 。 我將Java后端作為RESTful Web服務使用,沒有任何額外的框架(例如Jersey或RESTeasy),只是純Java。 那里有我的登錄POST方法:
@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();
}
我還看到人們使用了另一種方法。 就像這個例子一樣,它帶有過濾器。 我還想知道我的實現與此是否有所不同,並且預檢定義的確切位置在哪里-在我的實現中,.allow(“ OPTIONS”)會執行此操作,但是您可以糾正我的說法,這是錯誤的。
然后,我在Web應用程序中調用了POST方法。 我為此使用AngularJS。 在我的AuthenticateController控制器中,我具有Login方法,該方法在登錄表單中的Submit上調用。 實現看起來像這樣:
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'。”。
在調用后端時,是否應該在客戶端添加這兩個標頭值:
login
不處理Options請求,因此不會調用createResponse
。
看看: https : //blogs.oracle.com/theaquarium/entry/supporting_cors_in_jax_rs (您應該實現一個javax.ws.rs.container.ContainerResponseFilter
,請參閱如何使用帶有JAR-RS和Jersey的CORS處理CORS )
在此處編寫代碼的另一種可能性(但如果您開發的是“實際”應用程序則不是):將@javax.ws.rs.OPTIONS
添加到方法中,就像使用@javax.ws.rs.POST
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.