泽西岛过滤器不给出标头值



我们在 Java 中的 REST Web 服务中使用 jersey 2。 我们创造了javax.ws.rs.container.ContainerRequestFilterjavax.ws.rs.container.ContainerResponseFilter

我们在发送请求(如 appKey、机密、令牌等(时有标头。 如果我们命中来自 Postman 的请求,它会给出所有标头及其值,如下所示:

{
host=[localhost:8080], 
connection=[keep-alive], 
authorization=[bearer <token>], 
cache-control=[no-cache],  
x-request-id=[<request-id>], 
x-api-secret=[<secret>], 
user-agent=[Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.162 Safari/537.36], 
x-api-key=[api-key], 
postman-token=[<postman-token>], 
accept=[*/*], 
accept-encoding=[gzip, deflate, br], 
accept-language=[en-US,en;q=0.9]
}

如果我们命中来自 Web 客户端的请求,它会在access-control-request-headers下给出如下值(仅键,而不是它们的值(:

{
host=[localhost:8080], 
connection=[keep-alive], 
access-control-request-method=[GET], 
origin=[http://resttesttest.com], 
user-agent=[Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.162 Safari/537.36], 
access-control-request-headers=[authorization,x-api-key,x-api-secret,x-request-id], 
accept=[*/*],
accept-encoding=[gzip, deflate, br],
accept-language=[en-US,en;q=0.9]
}

为什么它不给标头参数值?

如何获得这些?

请指导我。 提前感谢!

首先,这些是您显示的请求标头,而不是响应标头,这似乎是您所说的。

此处显示的是来自 CORS预检请求的标头,而不是实际请求。预检请求是浏览器在实际请求之前执行的请求,与服务器验证该请求是否被允许。如果预检获得批准,则将提出真正的请求。在印前检查中,浏览器会询问服务器是否允许这些列出的标头。这是在请求标头access-control-request-headers中。同样,它使用access-control-request-method询问服务器是否允许GET方法调用。

在响应 CORS 预检请求时,服务器应使用标头响应那些确认请求可接受的标头。响应应包括以下标头

  • Access-Control-Allow-Origin- 这是对Origin预检请求标头的响应。该值应包括原点的值或*以允许所有源。这告诉浏览器允许源。

  • Access-Control-Allow-Headers- 这是对access-control-request-headers预检请求标头的响应。该值应为逗号分隔的列表,至少包含浏览器请求的所有标头。如果缺少其中任何一个,预检请求将失败。

  • Access-Control-Allow-Methods- 这是对access-control-request-method预检请求标头的响应。该值应至少是请求的方法,或者通常是允许的方法列表。

如果您查看这篇文章,您将看到一个ContainerResponseFilter用于通过添加所有必需的标头来处理此预检请求的返回,以通过印前检查验证。

@Provider
public class CORSFilter implements ContainerResponseFilter {
@Override
public void filter(ContainerRequestContext request,
ContainerResponseContext response) throws IOException {
response.getHeaders().add("Access-Control-Allow-Origin", "*");
response.getHeaders().add("Access-Control-Allow-Headers",
"origin, content-type, accept, authorization");
response.getHeaders().add("Access-Control-Allow-Credentials", "true");
response.getHeaders().add("Access-Control-Allow-Methods",
"GET, POST, PUT, DELETE, OPTIONS, HEAD");
}
}

在您的情况下,您可能希望将标题x-api-key,x-api-secret,x-request-id添加到Access-Control-Allow-Headers的列表中。这些值告诉浏览器可以发送这些标头。

预检请求成功后,浏览器将发送实际请求。如果预检失败,那么浏览器通常会提示您哪些验证失败。

相关内容

  • 没有找到相关文章

最新更新