java.lang.IllegalStateException:刷新数据时发生异常

java.lang.IllegalStateException:刷新数据时发生异常,java,servlets,servlet-filters,illegalstateexception,Java,Servlets,Servlet Filters,Illegalstateexception,可能重复: 以下是筛选器的一个片段。它获取客户端IP,设置属性,然后将请求链接到servlet @Override public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain) throws ServletException,IOException { String IP = request.getRemoteAddr(); request.se

可能重复:

以下是筛选器的一个片段。它获取客户端IP,设置属性,然后将请求链接到servlet

@Override
 public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain) 
        throws ServletException,IOException {
    String IP = request.getRemoteAddr();
    request.setAttribute("client IP from the filter", IP);
    chain.doFilter(request, response);
}
下面是servlet的一个片段,该servlet接收到一个过滤请求。它获取IP,将其存储为另一个属性,然后将请求发送到index.jsp

jsp,然后检索servlet设置的属性并对其进行处理

servlet是首次打开网站foo.com时运行的第一件事。但当我打开网站时,我看到了这个堆栈跟踪:

java.lang.IllegalStateException: Exception occurred when flushing data
at com.google.appengine.runtime.Request.process-d6995d0c305e239e(Request.java)
at org.apache.jasper.runtime.PageContextImpl.release(PageContextImpl.java:191)
at org.apache.jasper.runtime.JspFactoryImpl.internalReleasePageContext(JspFactoryImpl.java:118)
at org.apache.jasper.runtime.JspFactoryImpl.access$100(JspFactoryImpl.java:40)
at org.apache.jasper.runtime.JspFactoryImpl$PrivilegedReleasePageContext.run(JspFactoryImpl.java:166)
at java.security.AccessController.doPrivileged(AccessController.java:34)
at org.apache.jasper.runtime.JspFactoryImpl.releasePageContext(JspFactoryImpl.java:75)
at org.apache.jsp.index_jsp._jspService(index_jsp.java:139)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:390)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
at org.mortbay.jetty.servlet.Dispatcher.forward(Dispatcher.java:327)
at org.mortbay.jetty.servlet.Dispatcher.forward(Dispatcher.java:126)
at Servlets.FW_FirstSite.doGet(FW_FirstSite.java:27)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
at Filters.FirstSiteFilter.doFilter(FirstSiteFilter.java:24)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at org.mortbay.jetty.Server.handle(Server.java:326)
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
at com.google.tracing.TraceContext$TraceContextRunnable.runInContext(TraceContext.java:452)
at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:458)
at com.google.tracing.TraceContext.runInContext(TraceContext.java:698)
at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:336)
at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:328)
at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:456)
at java.lang.Thread.run(Thread.java:679)
Caused by: java.io.IOException: Stream closed
at org.apache.jasper.runtime.JspWriterImpl.ensureOpen(JspWriterImpl.java:204)
at org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:115)
at org.apache.jasper.runtime.PageContextImpl.release(PageContextImpl.java:188)
... 43 more
日志表明异常发生在Servlets.FW_FirstSite.doGet(FW_FirstSite.java:27)处,该语句是rd.forward(请求、响应);在Filters.FirstSiteFilter.doFilter(FirstSiteFilter.java:24)中,它是语句链.doFilter(请求,响应)


为什么要获取这些异常?

以下代码在doGet方法中的用途是什么

response.setContentType("text/plain");
PrintWriter writer = response.getWriter();

实际上,我还没有检查规范,但我怀疑是否允许您在将请求转发到另一个资源之前操纵servlet的响应(既不通过设置头,也不通过访问OutputStream或Writer)。

我猜您对response.getWriter()的调用在刷新客户端时启动向客户端写入响应。因此,您不能再转发该请求,因为它已经被刷新

您可以多次设置响应内容类型,但这并不重要,但除非您已经完成了预处理,否则不应呼叫编写器


还要注意,调用getOutputStream()也有同样的效果。

我编辑过,但得到的结果相同exception@SuhailGupta也被重新部署了?然后请编辑问题并删除行,以便使用所有最新代码进行更新。您现在已经发布了所有用于操作请求和响应对象的代码,对吗?编辑了问题。是的,我重新部署了它,即使此时发生异常,也可能是在输出流之前做了其他事情导致它被刷新。这段代码不可能说明什么,因为它没有任何问题-可能是其他地方做的事情,然后…@eis我发现了一些与此相关的东西。我们可以讨论一下吗@
response.setContentType("text/plain");
PrintWriter writer = response.getWriter();