我们将jersey 2用于Java中的REST
Web服务。我们创建了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
( 仅键,而不是其值 ):
{
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
通过添加所有必需的标头以通过预检验证来使用a来处理此预检请求的返回。
@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
。这些值告诉浏览器可以发送这些标头。
预检请求成功后,浏览器将发送实际请求。如果预检失败,则通常浏览器会提示您哪些验证失败。
我确实需要实体本身和它的任何注释,然后使用验证器注释的属性对该实体执行验证(看起来像JSR303,但我们不使用元数据注释整个bean)。从资源的实现角度来看,我的目标是能够在资源方法中键入以下内容: 我开始编写一个自定义MessageBodyReader,并设法使JSON完全工作,因为我只是委托ObjectMapper来反序列化JSON。除此之外,我得到了参数的注释,一切都很好地工作了。但是,当我
提取过滤器用于过滤数据源中提取的数据。如果用户从数据源中提取数据,则使用此过滤器。 将文本文件连接到Tableau后,可以在数据源选项卡的右上角看到两个选项“实时(Live)”和“提取(Extract)”。 实时连接直接连接到数据源。提取连接从数据源中提取数据,并在Tableau存储库中创建本地副本。下面逐步给出创建提取过滤器的过程。 第1步:使用Tableau连接文本文件。 单击“提取(Extr
我正试图在我的RecyclerView中实现搜索过滤器,就像在这篇文章中一样 我已经对它进行了调试,它确实按照预期过滤了项目,但列表在应用程序中似乎没有改变。一、 E:我过滤一个名字,有7个结果,在屏幕上是原始列表。 我的 onCreateMenu活动选项是: 我的适配器如下所示: 我忘了什么? 提前致谢!
问题内容: 该应用程序使用JDK 8,Spring Boot和Spring Boot Jersey启动程序,并打包为WAR(尽管它是通过Spring Boot Maven插件在本地运行的)。 我想做的是将我在运行中(在构建时)生成的文档作为欢迎页面。 我尝试了几种方法: 通过按照此处所述配置 适当的init参数,让Jersey提供静态内容 引入以便将生成的HTML文档作为欢迎文件列出。 这些都没有
该应用程序使用JDK8、Spring Boot和Spring Boot Jersey starter,并被打包为WAR(尽管它是通过Spring Boot Maven插件在本地运行的)。 我想做的是将我生成的文档(在构建时)作为欢迎页面。 我尝试了几种方法: 通过在中配置正确的init参数,让Jersey提供静态内容,如下所述 引入以便将生成的HTML文档列为欢迎文件。 这些都没有成功。 我希望避
void unregister_postfilter(string function_name) Use this to dynamically unregister a postfilter. 动态注销提交过滤器(在模板编译完成后执行)。