簡體   English   中英

由於CORS,HTTP發布請求失敗

[英]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.

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