当前位置: 首页 > 知识库问答 >
问题:

ContainerResponseFilter运行两次,未修改标头

容修贤
2023-03-14

过滤器拦截所有请求,并向响应添加自定义标头。

当我实现ContainerResponseFilter时,filter方法运行两次:

@Provider
public class MyCustomFilter implements ContainerResponseFilter throws IOException {

   @Override
   public void filter(ContainerRequestContext containerRequestContext, 
    ContainerResponseContext containerResponseContext) {
       containerResponseContext.getHeaders().add("My-Key", "myvalue");
    }

}

并且,提供给客户端的响应不包含头。

我尝试调试Jetty和泽西配置,并将问题缩小到以下无法修改的遗留控制器逻辑:

        OutputStream out = response.getOutputStream();
        PrintWriter printout = new PrintWriter(out);
        JSONObject obj = new JSONObject(dummyData);
        printout.print(obj);

似乎直接写入响应流会触发一些JAX-RS生命周期链,从而导致额外的处理阶段。

我在泽西2.52。1号码头和9.4号码头。4.

共有1个答案

徐峰
2023-03-14

解决了。

似乎是访问outputstream和执行printwriter。print()触发了HttpServletResponse的“写入”状态,并开始将响应返回给客户端。

所以在我的控制器里:

@GET
@Path("/seatemperatures")
public HttpServletResponse modifyResponse(@Context HttpServletRequest request, @Context HttpServletResponse response) {
    UtilClass.workOnResponse(request, response); //this uses printwriter.write()
    return response;
}

我必须将退货类型更改为作废:

@GET
@Path("/seatemperatures")
public void modifyResponse(@Context HttpServletRequest request, @Context HttpServletResponse response) {
    UtilClass.workOnResponse(request, response);
}

从控制器返回响应对象似乎引起内部500错误并且有效地尝试返回两个响应对象。

 类似资料:
  • 问题内容: 我有一些人已经解决过的问题,但问题是我不了解我的实现中缺少什么。 我的hibernate代码的一部分如下: 问题是我想通过更改hibernate.connection.url属性中的“数据库”一词来选择要在运行时中使用的数据库。 在javaswing中,我正在实现此功能: } 然后,我用按钮检查所做的更改,从组合框中选择所需的数据库: 现在,debug1的输出正在更改,因此我在此打印中

  • 问题内容: 我的一位同事说,SQL Server将最后修改的日期和时间保存在每条记录的“隐藏列”中。我很确定他说错了。你能向我确认一下吗? 问题答案: 正如其他人所暗示的那样,您的同事一定在胡说八道,或者指的是其他东西。为此,记录或页面的磁盘结构不包含对上次更新时间的任何引用。虽然可以在对象级别找到有关上次更新的信息,但在记录/行级别上找不到此类信息。

  • 我的Spring批处理过程运行了两次。 在这里阅读这个链接后,我添加了到我的application.yml.但是作业本身没有运行。 然后我尝试对我的作业配置类进行一些修改。我将实例变量移动到方法参数,希望能解决这个问题。但是再也没有运气了。 配置类 AppConfig.java更新 日志: 从日志中,您可以注意到 ***********处理器**********打印两次。(处理器每次打印两次,因为

  • 我正在修改服务器上为我设置的备份脚本。该脚本目前每天早上运行以备份目录下的所有域,如果可能的话,我希望每周只运行四次(周日、周二、周四、周六),而不是每天运行。我对脚本语言/命令比较陌生,想知道是否有人能帮我?以下是当前脚本: 谢谢你,杰森

  • 当我在其上传递一个帐户时,我的if会运行两次 所以是正确的: 因此它执行两次: 如何使用-400只运行一次?

  • 我有一个Selenium-Java-TestNG-Maven套件。我正在通过pom XML运行这个。但是maven在testng xml中运行了两次测试。但是,当我运行与TestNG套件相同的TestNG xml时,它的行为是正常的,也就是说,它只像预期的那样运行一次TestNG xml中的测试。 `http://maven.apache.org/xsd/maven-4.0.0.xsd“>4.0.