java - Jersey ContainerRequestFilter - 修改查询参数不会修改 Controller 中的上下文请求

标签 java tomcat jersey context-injection

我在 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/

相关文章:

jakarta-ee - 关于在网络上部署应用程序的错误

java - 如何在绑定(bind)80端口的单机上安装多个版本的tomcat?

tomcat - 能否指示浏览器缓存具有可变查询字符串的资源?

spring-boot - Jersey Rx 客户端 jersey-client-async-executor 关闭

java - Restful 图片上传异常

java - 如何在线连接到多个数据库?

java - 没有得到java程序的输出

java - Maven 指定编译时插件

java - 在子请求中调用子资源方法?

java - 我该如何调试这个 IE7 问题?