2010-09-04 125 views
0

當我爲所有jsp頁面創建過濾器時,瀏覽器進入無限循環,但是當我僅對一個頁面進行過濾時,它將正確運行!爲jsp文件使用過濾器時產生無限循環

這裏是doFilter方法,如果有一個人找到錯誤PLX告訴我...

public void doFilter(ServletRequest request, ServletResponse response, 
     FilterChain chain) throws IOException, ServletException { 
    if (debug) log("AuthenticationFilter:doFilter()"); 
    response.setContentType("text/html"); 
    PrintWriter out = response.getWriter(); 

    HttpServletResponse httpres = (HttpServletResponse) response; 
    HttpServletRequest httpreq = (HttpServletRequest) request; 

    if (httpreq.getRequestURI().indexOf("login.jsp") == -1 || httpreq.getRequestURI().indexOf("LoginServlet") == -1) { 
    // if(!httpreq.getRequestURL().equals("/OSQS/Login.jsp")){ 
     HttpSession session = httpreq.getSession(); 
     String logged = (String) session.getAttribute("login"); 

     if (logged == null) { 
      httpres.sendRedirect("login.jsp"); 
      return; 
     } 
    } 
    chain.doFilter(request, response); 

} 

回答

3

這個問題的原因是,該過濾器的url-pattern顯然過於籠統,例如/*或者也許*.jsp。它將在每個 JSP請求上執行

在過濾器中,當登錄用戶不在時,將發送重定向到login.jsp。重定向將指示客戶端發起新的HTTP請求。當請求URL匹配其url-pattern時,新的HTTP請求將再次調用過濾器。由於登錄用戶仍然不在,它進入無限重定向循環。

除了確定請求URL(與您一樣)之外,您還可以將受保護的頁面放置在更具體的url-pattern(例如, /secured/*,/private/*左右,然後將受保護的頁面放置在那裏,但不是登錄頁面。如果您重定向到登錄頁面,則不會再調用該過濾器。

+0

thanx它的工作瀏覽器沒有進入無限循環,並顯示登錄頁面,但是當我在URL中更改爲private/secure.jsp它進入無限循環:(並沒有重定向到登錄頁面!!爲什麼? – palAlaa 2010-09-04 23:46:05

+0

可能你還有一個安全文件夾的登錄頁面嗎?你是否將sendRedirect(「login.jsp」)更改爲'sendRedirect(「/ login.jsp」)'? – BalusC 2010-09-04 23:48:47

+0

我發現的問題是,如果他沒有登錄???我不知道爲什麼,因爲我確保從數據庫連接,然後使session.setAttribute(「登錄」,「確定」)後,在servlet中獲得會話形式的http請求;我在過濾器檢查,這裏: 字符串記錄=(字符串)session.getAttribute(「登錄」); 但我震驚,用戶得到會話屬性登錄=確定,但他沒有登錄!!!!!!!! !!!!!!!!!!!!! – palAlaa 2010-09-05 00:13:24