在Jersey过滤器中访问请求和响应

时间:2018-01-03 12:30:26

标签: jersey jersey-2.0 jersey-client

在泽西岛,可以添加ContainerRequestFilterContainerResponseFilter

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.FilterHttpServletRequest的标准HttpServletResponse,并且在调用端点之前调用它。

由于

1 个答案:

答案 0 :(得分:0)

如果不调用端点,则无法过滤任何内容,因为这是请求如何进入您的服务。如果你的意思是没有击中控制器,这是一个不同的故事。但即使这样,你也想要一些预先匹配的响应过滤器,它自然不存在。它违背了您服务的目的。为什么不在控制器和处理链中的任何其他部分完成工作后,在所有响应中添加所需的标题?!您可以在响应过滤器中访问请求上下文和响应上下文,因此Paul在评论中提到您可以在 ContainerRequestFilter 中存储requestContext中需要的一些信息。 JAX-RS规范有过滤器和拦截器的一些很好的例子。