在泽西岛,可以添加ContainerRequestFilter
或ContainerResponseFilter
public class RequestFilter implements ContainerRequestFilter {
@Override
public ContainerRequest filter(ContainerRequest containerRequest) {
// logic
}
}
public class ResponseFilter implements ContainerResponseFilter {
@Override
public ContainerResponse filter(ContainerRequest request,
ContainerResponse response) {
// logic
}
}
使用PackagesResourceConfig添加两者:
PackagesResourceConfig prc = new PackagesResourceConfig("com.company.xxx");
prc.getContainerRequestFilters().add(new RequestFilter());
prc.getContainerResponseFilters().add(new ResponseFilter());
虽然响应过滤器也可以访问请求,但在调用端点后调用它。我们需要的是能够在调用端点之前访问同一过滤器中的请求和响应。请求过滤器在端点之前调用,但无权访问响应。
似乎无法添加可以访问javax.servlet.Filter
和HttpServletRequest
的标准HttpServletResponse
,并且在调用端点之前调用它。
由于
答案 0 :(得分:0)
如果不调用端点,则无法过滤任何内容,因为这是请求如何进入您的服务。如果你的意思是没有击中控制器,这是一个不同的故事。但即使这样,你也想要一些预先匹配的响应过滤器,它自然不存在。它违背了您服务的目的。为什么不在控制器和处理链中的任何其他部分完成工作后,在所有响应中添加所需的标题?!您可以在响应过滤器中访问请求上下文和响应上下文,因此Paul在评论中提到您可以在 ContainerRequestFilter 中存储requestContext中需要的一些信息。 JAX-RS规范有过滤器和拦截器的一些很好的例子。