[英]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.