2013-07-01 87 views
0

我正在嘗試編寫一個篩選器,檢查用戶是否已登錄,並且如果沒有將他重定向到登錄頁面。以前我有過濾器,實際上什麼也沒做-_-這裏是,與該過濾器everythig工作正常,和會話失效:會話不會失效

public void doFilter(ServletRequest req, ServletResponse res, 
     FilterChain chain) throws IOException, ServletException { 
    HttpServletRequest request = (HttpServletRequest) req; 
    HttpSession session = request.getSession(); 
    if (session == null || session.getAttribute("UserName") == null) { 
     String command = request.getParameter("command"); 

     request.setAttribute("command", "login"); 
     // String page = ConfigurationManager.getInstance().getProperty(
     // ConfigurationManager.LOGIN_PAGE_PATH); 

    } else { 
     String username = (String) session.getAttribute("UserName"); 
     UserRole role; 
     try { 
      role = UserDAOImpl.getUserRole(username); 
      session.setAttribute("role", role); 
     } catch (DAOTechnicException e) { 
      logger.error(e); 
     } catch (DAOLogicException e) { 
      logger.error(e); 
     } 
    } 
    chain.doFilter(req, res); 
} 

,當我無效會話,然後它去(如果會話== NULL)阻止,一切都很好。

但現在我還有一個過濾器,在這裏它是:

public class UserCheckFilter implements Filter { 

    static class FilteredRequest extends HttpServletRequestWrapper { 

     public FilteredRequest(ServletRequest request) { 
      super((HttpServletRequest) request); 
     } 

     public String getParameter(String paramName) { 
      String value = super.getParameter(paramName); 
      if(value!=null){ 
       if (value.equals("login")) { 
        return value; 
       } 

       HttpSession session = super.getSession(); 
       if (session == null || session.getAttribute("UserName") == null) { 
        value = "login"; 
       } 
      } 
      return value; 
     } 
    } 

    /** 
    * Checks if user logged in and if not redirects to login page 
    */ 
    @Override 
    public void doFilter(ServletRequest req, ServletResponse res, 
      FilterChain chain) throws IOException, ServletException { 
     HttpServletRequest request = (HttpServletRequest) req; 
     HttpSession session = request.getSession(false); 
     if (session == null || session.getAttribute("UserName") == null) { 
      if(request.getParameter("command")!=null){ 
       String command = request.getParameter("command"); 
       if(!command.equals("login")){ 
        FilteredRequest filtrequest = new FilteredRequest(request); 
        String filteredvalue = filtrequest.getParameter("command"); 
        chain.doFilter(filtrequest, res); 
       }else{ 
        chain.doFilter(req, res); 
       } 
      }else{ 
       chain.doFilter(req, res); 
      } 
     } else { 
      String username = (String) session.getAttribute("UserName"); 
      UserRole role; 
      chain.doFilter(req, res); 
      try { 
       role = UserDAOImpl.getUserRole(username); 
       session.setAttribute("role", role); 

      } catch (DAOTechnicException e) { 
       logger.error(e); 
      } catch (DAOLogicException e) { 
       logger.error(e); 
      } 
     } 

    } 

中,我包的getParameter方法,並檢查是否不登錄的用戶試圖去用戶或管理頁面。但是,當我使會話無效時,它不會失效,即所有參數都保持不變,然後在過濾器中檢查會話!= null,它是否爲空,並在行session.setAttribute(「role」,role) ;我得到異常「會話已無效」

此處,我無效會話的方法:

if(request.getSession(false)!=null){ 
     request.getSession().invalidate(); 
    } 
    String page = ConfigurationManager.getInstance().getProperty(
       ConfigurationManager.LOGIN_PAGE_PATH); 
    return page; 

和servlet的u使用

RequestDispatcher dispatcher = getServletContext() 
       .getRequestDispatcher(page); 
     dispatcher.forward(request, response); 

,並順便說一句這樣的事情無效會話發生只有第二個過濾器

ps對不起,可能愚蠢的問題,但我真的不知道有什麼不對, 所以任何建議,將不勝感激。

+0

http:// stackoverflow。com/a/14562188/738746非常清楚地解釋了什麼時候以及你應該做什麼來實現你最終想要實現的目標。 –

回答

1

我想這是因爲你總是調用chain.doFilter()。

每甲骨文的文檔......

這種方法的典型實施將遵循以下 模式: -

  1. 檢查請求
  2. 可選包請求對象具有自定義用於過濾輸入過濾的內容或標頭
  3. (可選)用自定義實現包裝響應對象以過濾內容或標題爲輸出濾波
  4. 一個)要麼調用中使用FilterChain對象(chain.doFilter())鏈中的下一個實體,
  5. B)不轉嫁請求/響應對至過濾器鏈中的下一個實體阻止請求處理
  6. 在調用過濾器鏈中的下一個實體後,直接在響應上設置標題。

在步驟4,你可能想要做的(B) - 即,而不是將請求傳遞到下一個過濾鏈,將結果返回給用戶。我的意思是,這是一個無效的會話,所以爲什麼要花費額外的處理?

+0

好吧,thnx,我會試試看 – DeadKennedy