1. 程式人生 > >【Servlet+Struts2】檔案下載時丟擲java.lang.IllegalStateException異常的解決方法

【Servlet+Struts2】檔案下載時丟擲java.lang.IllegalStateException異常的解決方法

java.lang.IllegalStateException這種異常,不代表檔案不能下載,不代表程式寫錯,它在Tomcat丟擲完異常之後依然能夠正常執行的。只是看著不爽而已,每次下載都要在Tomcat丟擲一大堆異常。

java.lang.IllegalStateException主要是用了後臺把檔案丟進respond的緩衝區,然後respond再把下載的檔案扔回JSP的情況所造成的。Servlet與Struts2反正是JSP都有可能存在。其主要原因JSP在對緩衝區讀,後臺JAVA在對緩衝寫所導致。

如果Struts2按照《【Struts2】中文檔案的下載與下載許可權的控制》(點選開啟連結)以輸入輸出流的方式把檔案拋向前臺給使用者下載絕對不會這種問題。

一般不應該用respond去傳遞檔案,畢竟有一個互斥問題,但也不是不可以解決。

對於JSP+Servlet開發的頁面,只需要在JSP頁面加上:

<%
out.clear(); 
out=pageContext.pushBody();
%>

然後在後臺的JAVA檔案檢查:

①在response.sendRedirect()方法後加return語句即可,如下:

response.sendRedirect("login.jsp");
return;
②檢查提交的url是否有誤。
③如果你的頁面中用了清快取程式碼response.flushbuffer();又用到了response.sendRedirect(url);,你可以把response.flushbuffer();去掉,或者用JS的window.location.href="url";來做轉向。

如果是Struts2應該把return success;改成return null;對應的struts.xml中的Action的result的name屬性去到,反正下載除了斷網就從來沒有見過失敗了。就可以正常下載的。