struts2-java.lang.IllegalStateException在操作调用结果流下载PDF文件时间歇性发生

struts2-java.lang.IllegalStateException在操作调用结果流下载PDF文件时间歇性发生,java,jsp,struts2,pdf-generation,download,Java,Jsp,Struts2,Pdf Generation,Download,我有一个名为GetFile的操作,它直接打开一个文件下载框来打开PDF 下面是struts.xml配置和操作类。我使用结果类型作为流来实现这一点。我可以看到pdf下载框一直打开,我也可以下载文件 但我发现昨晚有一些请求触发了该操作,并产生了以下错误 org.apache.jasper.JasperException: java.lang.IllegalStateException: getOutputStream() has already been called for this re

我有一个名为GetFile的操作,它直接打开一个文件下载框来打开PDF

下面是struts.xml配置和操作类。我使用结果类型作为流来实现这一点。我可以看到pdf下载框一直打开,我也可以下载文件

但我发现昨晚有一些请求触发了该操作,并产生了以下错误

    org.apache.jasper.JasperException: java.lang.IllegalStateException: getOutputStream() has already been called for this response
        at org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:570)
        at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:452)
        at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:391)
        at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
        at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:684)
        at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:593)
        at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:530)
        at org.apache.struts2.dispatcher.ServletDispatcherResult.doExecute(ServletDispatcherResult.java:159)
        at org.apache.struts2.dispatcher.StrutsResultSupport.execute(StrutsResultSupport.java:186)
        at com.opensymphony.xwork2.DefaultActionInvocation.executeResult(DefaultActionInvocation.java:374)
        at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:278)
        at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:211)
        at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
        at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
        at com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:187)
        at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
        at deshaw.irweb.web.interceptor.AuthInterceptor.intercept(AuthInterceptor.java:60)
        at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
        at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:54)
        at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:510)
        at org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:434)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:498)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:394)
        at org.apache.coyote.ajp.AjpProcessor.process(AjpProcessor.java:294)
        at org.apache.coyote.ajp.AjpProtocol$AjpConnectionHandler.process(AjpProtocol.java:183)
        at org.apache.coyote.ajp.AjpProtocol$AjpConnectionHandler.process(AjpProtocol.java:169)
        at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
        at java.lang.Thread.run(Thread.java:722)
Caused by: java.lang.IllegalStateException: getOutputStream() has already been called for this response
        at org.apache.catalina.connector.Response.getWriter(Response.java:636)
        at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:205)
        at javax.servlet.ServletResponseWrapper.getWriter(ServletResponseWrapper.java:105)
        at org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:125)
        at org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:118)
        at org.apache.jasper.runtime.PageContextImpl.release(PageContextImpl.java:182)
        at org.apache.jasper.runtime.JspFactoryImpl.internalReleasePageContext(JspFactoryImpl.java:123)
        at org.apache.jasper.runtime.JspFactoryImpl.releasePageContext(JspFactoryImpl.java:80)
        at org.apache.jsp.jsp.ServerError_jsp._jspService(ServerError_jsp.java:157)
        at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
        at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:419)
        ... 38 more     
有人能告诉我是什么导致了这个问题吗?我目前无法重现该问题。我在某个地方读到,这可能是由于关闭了下载对话框,但即使在我尝试使用多个浏览器之后,情况也并非如此。也已检查,但无法直接与我的问题相关,因为struts2操作直接导致结果流,因此没有重定向到jsp

struts.xml
我在使用Internet Explorer时遇到了类似的问题,并通过在响应标题中添加以下内容修复了该问题:

response.setHeader("Expires","0");
response.setHeader("Pragma","cache");
response.setHeader("Cache-Control","private");
可能是您在日志中看到的由Internet Explorer生成的请求

看一看,看一看

更新:要在日志中打印浏览器版本,可以执行以下操作:

System.out.println(request.getHeader("User-Agent"));

请发布完整的堆栈跟踪,简而言之,如果此行为不可复制,则很难猜测用户行为。该操作是否具有任何参数?是的,该操作具有两个参数(id),它们在查询字符串中传递。这在下载文件中用于帮助查找适当的PDF文档。谢谢。虽然这可能是IE的问题,您能告诉我IE中的确切用户行为可能有助于我重现问题吗?请尝试使用多个版本的IE,并在测试时从受信任的站点删除url,并查看日志,以了解当提示您的下载被阻止时会发生什么。@TGV如果我的回答没有任何帮助,请告诉我,我将移除它。我不想得到不应有的赏金。当然,你的回答很有帮助。在从可信网站删除url后,我在几款IE浏览器上尝试了这一点,但它从未产生任何错误。此外,我可能是错误的IE版本,我使用的。因此,这仍然是一个难以复制的问题。查看堆栈跟踪,最后一次调用是paramsinterceptor,因此这将是strust2本身的问题。基本上,我在想,如果浏览器还没有进入上下文中。我只是在猜测。试试IE 6和7。也许您最好的方法是在日志中写入浏览器版本,然后查看问题是否仅出现在特定类型的浏览器上。
response.setHeader("Expires","0");
response.setHeader("Pragma","cache");
response.setHeader("Cache-Control","private");
System.out.println(request.getHeader("User-Agent"));