我在 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”。
Controller 看起来像:
@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
解析的查询参数,但它没有改变注入(inject)的上下文。注入(inject)的上下文不应该也被 PreMatching 过滤器修改吗?
最佳答案
servlet 层,HttpServletRequest
不会被 Jersey 修改。对请求的修改保留在 Jersey 。如果您使用 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 规范,您应该在 https://java.net/jira/browse/JERSEY/ 提交错误
如果您需要修改 HttpServletRequest
对象,您可能会在 SO 找到有用的 Michal 答案:https://stackoverflow.com/a/18331401/3114959
关于java - Jersey ContainerRequestFilter - 修改查询参数不会修改 Controller 中的上下文请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37473971/