Cannot forward after response has been committed問題的解決

Cannot forward after response has been committed問題解決及分析

經過TOMCAT把系統啓動,能夠正常登錄門戶,登錄進去選擇子系統的時候點擊登錄的時候,但是去又回到了登錄界面,如此反覆就是不可以進入子系統,查看後臺報的錯誤:html

Cannot forward after response has been committedjava

中文意思就是已經有提交了,不可以再次轉向了,而後根據JSP標籤中設置的錯誤頁面又回到了登錄頁面。web

(核心:同一個servlet(而且該servlet裏面存在重定向或者請求轉發)被屢次訪問,而致使了上面出現的錯誤)。見我出現錯誤的例子:websocket

package sc.tl.filter;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.websocket.Session;

/**
 * Servlet Filter implementation class adminLogin
 */
@WebFilter("/manage/*")
public class adminLogin implements Filter {
    
    public void destroy() {
        
    }

    /**
     * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
     */
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        //父類轉子類
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse res = (HttpServletResponse) response;
        
        //設置字符集
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        
        HttpSession s = req.getSession();
        //獲取session中的isAdmin的值
        String flag = (String)s.getAttribute("isAdminLogin");
        
        String spath =  req.getRequestURI().substring(req.getContextPath().length());
        if(spath.contains("admin_")) {
            if(flag!=null && flag.equals("1")) {
                chain.doFilter(request, response);
                return;      //出現上述問題的地方
            } else {
                PrintWriter out = response.getWriter();
                out.write("<script>");
                out.write("alert('請先登陸管理員用戶帳號!');");
                out.write("location.href='login.jsp';");
                out.write("</script>");
                out.close();
                return;
            }
        }
        chain.doFilter(request, response);
    }

    /**
     * @see Filter#init(FilterConfig)
     */
    public void init(FilterConfig fConfig) throws ServletException {
        // TODO Auto-generated method stub
    }

}

上面的代碼是一個關於用戶訪問管理員頁面的一個過濾器。若是是管理員且登陸那麼就轉發到相應的servlet或者jsp頁面中去,不然就決絕訪問。session

而我找了一半天的錯誤居然是管理員驗證成功socket

chain.doFilter(request, response);
以後,忘記return跳出了,致使再一次執行了最後面的
chain.doFilter(request, response);也就是說若是是管理員能夠訪問的servlet和jsp,那麼始終會訪問兩次,就會爆Cannot forward after response has been committed的錯誤!本身注意查看,出現這樣的錯誤,確定是不注意的是後訪問了兩次。
相關文章
相關標籤/搜索