containerSponseFilter运行两次,标头未修改



滤波器截止所有请求,并在响应中添加自定义标头。

当我实现containSponseFilter时,过滤器方法运行两次:

@Provider
public class MyCustomFilter implements ContainerResponseFilter throws IOException {
   @Override
   public void filter(ContainerRequestContext containerRequestContext, 
    ContainerResponseContext containerResponseContext) {
       containerResponseContext.getHeaders().add("My-Key", "myvalue");
    }
}

,并且向客户提供的响应确实包含标头。

我尝试过调试码头和泽西岛配置,并将问题范围缩小到以下旧控制器逻辑,我无法修改:

        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。

解决了它。

似乎访问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;
}

我必须将返回类型更改为void:

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

从控制器返回响应对象似乎会导致内部500错误,并有效地尝试返回两个响应对象。

最新更新