泽西岛过滤器不提供 header 值
Jersey filter does not give header values
我们在 Java 中将 jersey 2 用于我们的 REST Web 服务。
我们创建了 javax.ws.rs.container.ContainerRequestFilter
和 javax.ws.rs.container.ContainerResponseFilter
我们在发送 appKey、secret、token 等请求时有 headers。
如果我们命中来自 Postman 的请求,它会给出所有 header 及其值,如下所示:
{
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]
}
如果我们从我们的网络客户端发出请求,它会在 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]
}
为什么它不给 header 参数值?
如何获得这些?
请指导我。
提前致谢!
首先,您显示的是 请求 header,而不是 响应 header,好像你在说他们是。
您在此处显示的是来自 CORS preflight 请求的 header,而不是实际请求。预检请求是浏览器在实际请求之前执行的请求,与服务器验证该请求是否被允许。如果预检获得批准,则将发出真正的请求。在预检中,浏览器询问服务器是否允许列出的 headers。这是在请求 header access-control-request-headers
中。同样,它使用 access-control-request-method
询问服务器是否允许 GET
方法调用。
在对 CORS 预检请求的响应中,服务器应该用 headers 来响应那些确认请求是可以接受的。响应应包括以下 headers
Access-Control-Allow-Origin
- 这是对 Origin
预检请求 header 的响应。该值应包括 Origin 的值或 *
以允许所有来源。这告诉浏览器允许来源。
Access-Control-Allow-Headers
- 这是对 access-control-request-headers
预检请求 header 的响应。该值应该是逗号分隔的列表,其中至少包含浏览器请求的所有 header。如果缺少任何一个,预检请求将失败。
Access-Control-Allow-Methods
- 这是对 access-control-request-method
预检请求 header 的响应。该值应该至少是请求的方法,或者通常是允许的方法列表。
如果您查看 this post,您会看到 ContainerResponseFilter
用于通过添加所有必需的 header 来处理此预检请求的 return通过预检。
@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");
}
}
在您的情况下,您可能希望将 headers x-api-key,x-api-secret,x-request-id
添加到 Access-Control-Allow-Headers
的列表中。这些值告诉浏览器可以发送这些 headers.
预检请求成功后,浏览器才会发送实际请求。如果预检失败,那么通常浏览器会提示您哪些验证失败。
我们在 Java 中将 jersey 2 用于我们的 REST Web 服务。
我们创建了 javax.ws.rs.container.ContainerRequestFilter
和 javax.ws.rs.container.ContainerResponseFilter
我们在发送 appKey、secret、token 等请求时有 headers。 如果我们命中来自 Postman 的请求,它会给出所有 header 及其值,如下所示:
{
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]
}
如果我们从我们的网络客户端发出请求,它会在 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]
}
为什么它不给 header 参数值?
如何获得这些?
请指导我。 提前致谢!
首先,您显示的是 请求 header,而不是 响应 header,好像你在说他们是。
您在此处显示的是来自 CORS preflight 请求的 header,而不是实际请求。预检请求是浏览器在实际请求之前执行的请求,与服务器验证该请求是否被允许。如果预检获得批准,则将发出真正的请求。在预检中,浏览器询问服务器是否允许列出的 headers。这是在请求 header access-control-request-headers
中。同样,它使用 access-control-request-method
询问服务器是否允许 GET
方法调用。
在对 CORS 预检请求的响应中,服务器应该用 headers 来响应那些确认请求是可以接受的。响应应包括以下 headers
Access-Control-Allow-Origin
- 这是对Origin
预检请求 header 的响应。该值应包括 Origin 的值或*
以允许所有来源。这告诉浏览器允许来源。Access-Control-Allow-Headers
- 这是对access-control-request-headers
预检请求 header 的响应。该值应该是逗号分隔的列表,其中至少包含浏览器请求的所有 header。如果缺少任何一个,预检请求将失败。Access-Control-Allow-Methods
- 这是对access-control-request-method
预检请求 header 的响应。该值应该至少是请求的方法,或者通常是允许的方法列表。
如果您查看 this post,您会看到 ContainerResponseFilter
用于通过添加所有必需的 header 来处理此预检请求的 return通过预检。
@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");
}
}
在您的情况下,您可能希望将 headers x-api-key,x-api-secret,x-request-id
添加到 Access-Control-Allow-Headers
的列表中。这些值告诉浏览器可以发送这些 headers.
预检请求成功后,浏览器才会发送实际请求。如果预检失败,那么通常浏览器会提示您哪些验证失败。