新泽西 - 预检请求的响应未通过访问控制检查:没有“访问控制允许来源”。

4

错误截图:

在此输入图片描述

下面是我的 API 类,在其中我编写了 @OPTIONS 方法的代码。

@OPTIONS 
    public Response OptionsFirstRequst(){
         return Response.ok()
      .header("Access-Control-Allow-Origin", "*")
      .header("Access-Control-Allow-Methods", "*")
      .header("Access-Control-Allow-Headers", "*").build();
    }

我创建了一个名为“Response Builder”的类,用于为每个请求发送响应。 以下是“Response Builder”类的代码:

    public class ResponseBuilder {

    public int status;
    public HashMap data;
    public String error;

    public static Response ok(int Status_code, HashMap<String, String> data, String Response_error) {
        if (data == null) {
            data = new HashMap();
        }

        ResponseBuilder response = new ResponseBuilder();
        response.status = Status_code;
        response.data = data;
        response.error = Response_error;

        return Response.status(Status_code).entity(response)
                .header("Access-Control-Allow-Origin", "*")
                .header("Access-Control-Allow-Methods", "*")
                .header("Access-Control-Allow-Headers", "*").build();
    }

    public static Response error(int Status_code, HashMap<String, String> data, String Response_error) {
        if (data == null) {
            data = new HashMap();
        }

        ResponseBuilder response = new ResponseBuilder();
        response.status = Status_code;
        response.data = data;
        response.error = Response_error;
        response.data = new HashMap();

        return Response.status(Status_code).entity(response)
                .header("Access-Control-Allow-Origin", "*")
                .header("Access-Control-Allow-Methods", "*")
                .header("Access-Control-Allow-Headers", "*").build();
    }

}

我还有一个请求过滤器,对每个请求进行令牌验证,除了登录请求之外。
我能够登录,生成令牌并将其返回给浏览器。但是,在登录后如果我点击个人资料,虽然在开发工具的网络中看到响应代码为200,但是我没有得到任何数据或正确的响应。
同时,我收到以下错误信息:

响应预检请求未通过访问控制检查:所请求的资源上不存在'Access-Control-Allow-Origin'头部。

1个回答

4
要检查和添加CORS头,常见的解决方案是使用 javax.ws.rs.container.ContainerResponseFilter。以下是一个示例,其中允许的来源在类 ApplicationConfig.accessControlAllowedOrigins 中配置:
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerResponseContext;
import javax.ws.rs.container.ContainerResponseFilter;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.ext.Provider;
import java.io.IOException;

@Provider
public class ResponseCorsFilter implements ContainerResponseFilter {

    @Override
    public void filter(ContainerRequestContext requestContext, 
            ContainerResponseContext responseContext) throws IOException {

        MultivaluedMap<String, Object> responseHeaders = responseContext.getHeaders();
        String origin = requestContext.getHeaderString("Origin");
        if (null != origin && 
            (ApplicationConfig.accessControlAllowedOrigins.contains(origin) ||
                 ApplicationConfig.accessControlAllowedOrigins.contains("*"))) {

            responseHeaders.putSingle("Access-Control-Allow-Origin", origin);
            responseHeaders.putSingle("Access-Control-Allow-Methods", 
                "GET, POST, OPTIONS, PUT, DELETE, HEAD");

            String reqHead = requestContext.getHeaderString(
                "Access-Control-Request-Headers");

            if (null != reqHead && !reqHead.equals("")) {
                responseHeaders.putSingle("Access-Control-Allow-Headers", reqHead);
            }
        }
    }
}

ApplicationConfig 中的 accessControlAllowedOrigins 是什么样子? - antogerva
它是一个包含 Access-Control-Allow-Origin 值的字符串。参见:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_CORS ,例如:通配符、单个网址或逗号分隔的网址列表。 - Meiko Rachimow
上面的链接由@MeikoRachimow提供,现在已经失效。我的猜测是新链接应该为https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Origin。 - Verem Dugeri
1
@DanielVerem 不是,这是指向jersey的链接 https://eclipse-ee4j.github.io/jersey.github.io/documentation/latest/filters-and-interceptors.html 我在回答中将其更改了。 - Meiko Rachimow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接