Java Jersey ContainerRequestFilter-修改查询参数不会修改控制器中的上下文请求
jersey 2.23中的以下过滤器在tomcat 7.0.69中运行:Java Jersey ContainerRequestFilter-修改查询参数不会修改控制器中的上下文请求,java,tomcat,jersey,context-injection,Java,Tomcat,Jersey,Context Injection,jersey 2.23中的以下过滤器在tomcat 7.0.69中运行: @PreMatching @Priority(Priorities.HEADER_DECORATOR) public class TestFilter implements ContainerRequestFilter { @Context HttpServletRequest req; @Override public void filter(ContainerRequestContex
@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);
...
}
然后我提出一项要求:
我预计产出为:
Context query string: a=c
Query param value: c
然而,输出是:
Context query string: a=b
Query param value: c
因此,我的过滤器修改了使用
@QueryParam
解析的查询参数,但它没有改变注入的上下文。注入的上下文不应该也被预匹配过滤器修改吗?servlet层,HttpServletRequest不会被修改。对请求的修改仍保留在泽西岛。如果使用JAX-RS专用UriInfo
:
@Context
private UriInfo uriInfo;
@GET
@Path("/PathToController")
public Response get(@QueryParam("a") String val) {
System.out.println("Context query string: " + uriInfo.getQueryParameters());
System.out.println("Query param value:" + val);
...
}
您将看到查询参数值按预期更改
如果您认为这种行为违反了JAX-RS规范,您应该在
如果您需要修改
HttpServletRequest
对象,您可能会在SO:找到有用的Michal答案,谢谢您的回答。实际上,注入的UriInfo对象具有修改的查询参数。但是,我没有看到在过滤器中修改HttpServletRequest对象的方法。我可以使用setProperty(),但这似乎只是在请求上设置一个属性。螺纹局部注射不起作用。我想在泽西岛项目中提交一个票证,但是似乎我需要创建一个帐户,这目前是不可能的。关于如何提交车票有什么想法吗?很抱歉造成混乱ThreadLocal
仅在筛选器为单例且Jersey 2.x中似乎不支持时才有用。无论如何,修改HttpServletRequest确实很复杂,尤其是在没有标准API的情况下。请查看此答案,它可能会对您有所帮助: