1. 程式人生 > >控制檯報錯Cannot forward after response has beencommitted ,可是頁面還是可以正常跳轉

控制檯報錯Cannot forward after response has beencommitted ,可是頁面還是可以正常跳轉

轉載自:https://blog.csdn.net/ljheee/article/details/51049773

通過toncat啟動伺服器,可以正常登陸訪問,登陸進去選擇子系統的時候點選登陸的時候,可是去又回到了登陸介面,如此反覆就是不能夠進入子系統,檢視後臺報的錯誤: java.lang.IllegalStateException: Cannot forward after response has been committed 

這個錯誤可以用500頁面攔截,但是後臺一直報錯。這個是屬於程式碼語法錯誤。

中文意思就是已經有提交了[response已經響應了使用者],不能夠再次轉向了,然後根據JSP標籤中設定的錯誤頁面又回到了登陸頁面;

這個是錯誤是由於response多次提交或者是由於有頁面顯示後仍然含請求轉向產生的,就是說程式在return之前就已經執行了跳轉或者執行過response。我在做這個時,簡直要奔潰了,怎麼弄都不行,網上的資源找遍了,最後總結了以下幾類導致的錯誤,並給出解決方案。

第一類:

1、  往輸出流寫了東西,然後又跳轉了頁面。

也就是說,

Stringurl = "/treatDenglu.jsp";

RequestDispatcher rd =request.getRequestDispatcher(url);

           rd.forward(request,response);

在此語句跳轉之前,你使用了檔案操作流;可以先註釋掉再嘗試。

第二類

2、  out物件,向JSP頁面print了資料,然後又跳轉。

也就是說,PrintWriter out = response.getWriter();

                     out.println(“<html>”);

獲得了out物件,往JSP頁面列印輸出,如果有這樣的語句會報錯,因為我們寫的servlet類,就是用來響應使用者的訪問請求的,而out.print()是要把內容輸出到(響應)頁面,也是對使用者訪問的響應,所以如果在跳轉之前有out.println(“<html>”)相當於已經response響應了使用者請求,所以再rd.forward(request,response就會)提示已經重複提交。

解決方案:使用MVC模型,把out.println(“<html>”)語句去掉,其相應的功能交給JSP頁面顯示。

第三類

3、  如果前面2種後還有錯,那可能由於呼叫了父類的super.doPost(request,response);

這是因為,doPost()[doXXX()]方法就是service()執行過程中判斷使用者訪問方式(post、get等)後,呼叫的響應響應方法,即執行相應的doXXX()方法去響應使用者,而顯示呼叫父類的doPost()方法,且先執行完,就等於已經響應了一次,然後又去跳轉又去響應,就會報錯重複提交。所以去掉super.doPost(request,response);

第四類

4、  如果還有問題,看看這種;

正如前面所說,這個是錯誤是由於response多次提交或者是由於有頁面顯示後仍然含請求轉向產生的,就是說程式在return之前就已經執行了跳轉或者執行過response,之後遇到return的話,程式想再次執行跳轉,也就是重定向,這時功能也許會實現了,解決辦法是在跳轉語句末尾加上return;或return null;,,就不能轉到另外的頁面了

如 servlet.getServletContext().getRequestDispatcher("/deal.jsp").forward(request, response);  

 return null;  

小提示:

1、forward(request, response);跳轉頁面,執行這個語句之後,如果此語句後面還有程式碼,既然跳轉了頁面後面程式碼執行不了,原頁面的程式碼沒有終止一定會出錯。
解決方法,在forward(request, response);跳轉後面不要寫其他程式碼,且加上 return; 
2、自己寫的servlet類更改程式碼後,重新編譯,且要重啟伺服器;修改了配置檔案web.xml不需重啟,tomcat會重新載入。

本人的錯誤在於:

else {
// login success
request.getSession().setAttribute("user", sysUser);
if(!StringUtils.isEmpty(ret)){
 response.sendRedirect(ret); //問題所在
//return ;

}else{
response.sendRedirect("admin/index.page"); //TODO問題所在
//return ;
}
    }
request.setAttribute("error", errorMsg);
request.setAttribute("user", sysUser);
String path="signin.jsp";

request.getRequestDispatcher(path).forward(request, response);

在如圖所示的加紅色字型的“問題所在”,之後已經重定向了,我還寫了程式碼

request.setAttribute("error", errorMsg);
request.setAttribute("user", sysUser);
String path="signin.jsp";

request.getRequestDispatcher(path).forward(request, response);

所以,最後的方法是加一個return ;讓程式在這的時候,停止執行。