简体   繁体   English

Jax-rs和servlet过滤器:IllegalStateException:响应已提交

[英]Jax-rs and servlet filter: IllegalStateException: Response already committed

I have REST API with JAX-RS, and I need to add encryption to the responses, so I added a servlet filter: 我具有带有JAX-RS的REST API,并且需要在响应中添加加密,因此添加了一个servlet过滤器:

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
        throws IOException, ServletException {

    ServletRequestWrapper request = new ServletRequestWrapper((HttpServletRequest) servletRequest);
    ServletResponseWrapper response = new ServletResponseWrapper((HttpServletResponse) servletResponse);
    PrintWriter out = response.getWriter();

    filterChain.doFilter(request, response);

    response.getResponse().resetBuffer();
    String servletResponseString = response.toString();
    out.write("Hola"); // Here you can change the response
    out.flush();
    out.close();

    logger.info("AFTER filter, original response: "
            + servletResponseString);
}

But I get java.lang.IllegalStateException: Response already committed 但是我得到了java.lang.IllegalStateException: Response already committed

Is there any problem using JAX-RS and servlet filters? 使用JAX-RS和servlet过滤器有什么问题吗? Is there any way to retain the response from being send? 有什么办法可以阻止响应被发送?

Thanks. 谢谢。

JAX-RS works fine with servlet filterers. JAX-RS与servlet过滤器配合良好。 Check if any of the other filters you have has committed the response. 检查您是否已提交其他任何过滤器响应。

[Update] If you're using Jersey, check Jersey's Docs [更新]如果您使用的是Jersey,请检查Jersey的文档

for ContainerResponseFilter. 用于ContainerResponseFilter。

[Update 2] An example: Filter class, JerseyTestFilter.java: [更新2]示例:过滤器类JerseyTestFilter.java:

package jersey.example;
import com.sun.jersey.spi.container.ContainerRequest;
import com.sun.jersey.spi.container.ContainerResponse;
import com.sun.jersey.spi.container.ContainerResponseFilter;

public class JerseyTestFilter implements ContainerResponseFilter {
@Override 
    public ContainerResponse filter(ContainerRequest request, ContainerResponse response) {
       String resp = (String) response.getEntity();
       resp += " - filter applied";
      response.setEntity(resp);
      return response;
    }
}

It assumes that the response body is a string and modifies it. 它假定响应主体是一个字符串,然后对其进行修改。

Now this goes to web.xml inside <servlet> : 现在,它进入<servlet>内的web.xml:

<init-param>
    <param-name>com.sun.jersey.spi.container.ContainerResponseFilters</param-name>
    <param-value>jersey.example.JerseyTestFilter</param-value>
</init-param>

Here is the working exmaple 这是工作实例

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM