我们将jersey 2用于Java中的REST Web服务。我们创建了javax.ws.rs.container.ContainerRequestFilter和javax.ws.rs.container.ContainerResponseFilter
javax.ws.rs.container.ContainerRequestFilter
javax.ws.rs.container.ContainerResponseFilter
在发送诸如appKey,secret,token等请求时,我们具有标头。如果我们命中了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( 仅键,而不是其值 ):
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方法调用。
access- control-request-headers
access-control-request- method
GET
在对CORS预检请求的响应中,服务器应使用标头来响应那些确认请求是可接受的标头。响应应包含以下标头
Access-Control-Allow-Origin-这是对Origin预检请求标头的响应。该值应包括原始值或*允许所有原始值。这告诉浏览器允许原点。
Access-Control-Allow-Origin
Origin
*
Access-Control-Allow-Headers-这是对access-control-request-headers预检请求标头的响应。该值应为逗号分隔的列表,至少包含浏览器请求的所有标头。如果缺少任何一项,则预检请求将失败。
Access-Control-Allow-Headers
Access-Control-Allow-Methods-这是对access-control-request-method预检请求标头的响应。该值应至少为请求的方法,或者通常为允许的方法列表。
Access-Control-Allow-Methods
access-control-request-method
如果查看此文章,您将看到ContainerResponseFilter通过添加所有必需的标头以通过预检验证来使用a来处理此预检请求的返回。
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。这些值告诉浏览器可以发送这些标头。
x-api-key,x-api-secret,x-request-id
Access-Control- Allow-Headers
预检请求成功后,浏览器将发送实际请求。如果预检失败,则通常浏览器会提示您哪些验证失败。