由于CORS

时间:2016-03-05 00:06:46

标签: javascript java angularjs cors preflight

我无法让我的应用程序运行。我一整天都在读这篇文章,尝试过一堆东西,但最后没有任何工作。在上一次尝试中,我尝试了这个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方法基本上添加了必要的标题,如下所示:

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'。对预检请求的响应没有通过访问控制检查:否'访问控制 - 允许 - 来源'标头出现在请求的资源上。 Origin' placeholder-client-URL'因此不允许访问。"。

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

  • 访问控制请求-方法
  • 访问控制请求报头

1 个答案:

答案 0 :(得分: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,就像使用git clone https://github.com/googlesamples/tango-examples-java.git Cannot reload AVD list: cvc-enumeration-valid: Value '280dpi' is not facet-valid with respect to enumeration[ldpi, mdpi, tvdpi, hdpi, xhdpi, 400dpi, xxdpi, 560dpi, xxxhdpi] it must be a value from the enumeration. 一样。