我在Tomcat 7.0.69上运行Jersey 2.23,具有以下过滤器:
@PreMatching
@Priority(Priorities.HEADER_DECORATOR)
public class TestFilter implements ContainerRequestFilter {
@Context
HttpServletRequest req;
@Override
public void filter(ContainerRequestContext conReqCtx) throws IOException {
UriBuilder b = conReqCtx.getUriInfo().getRequestUriBuilder();
b.replaceQueryParam("a", "c");
conReqCtx.setRequestUri(b.build());
}
}
这个过滤器会将查询参数“a”的值替换为“c”的值。
控制器如下:
@Context
HttpServletRequest req;
@GET
@Path("/PathToController")
public Response get(@QueryParam("a") String val) {
System.out.println("Context query string: " + req.getQueryString());
System.out.println("Query param value:" + val);
...
}
我随后发出一个请求:http://localhost:8080/PathToController?a=b
我期望的输出结果是:
Context query string: a=c
Query param value: c
然而,输出结果为:
Context query string: a=b
Query param value: c
因此,我的过滤器修改了使用@QueryParam
解析的查询参数,但它没有改变注入的上下文。预匹配过滤器不应该也修改注入的上下文吗?
ThreadLocal<HttpServletRequest>
只有在过滤器是单例的情况下才有用,而且似乎在 Jersey 2.x 中不受支持。无论如何,修改HttpServletRequest
确实很复杂,特别是如果没有标准 API 的话。请查看这个答案,它可能会对你有所帮助:https://dev59.com/VnNA5IYBdhLWcg3wn_Q1 - Stepan Vavra