gpt4 book ai didi

javascript - 由于 CORS,HTTP post 请求失败

转载 作者:行者123 更新时间:2023-12-02 03:51:52 25 4
gpt4 key购买 nike

我无法让我的应用程序运行。我一整天都在读这个,尝试了很多东西,但最终没有任何效果。在最后一次尝试中,我尝试了这个 link 。我将 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 方法基本上添加了必要的 header ,如下所示:

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 Controller 中,我有 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' header 存在所请求的资源。因此不允许访问来源“placeholder-client-URL”。”。

在调用我的后端时,我是否应该在客户端添加这两个 header 值:

  • 访问控制请求方法
  • 访问控制请求 header

最佳答案

Options 请求不是由 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.

关于javascript - 由于 CORS,HTTP post 请求失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35808288/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com