2014-08-29 145 views
0

我已經寫了一個過濾器,它應該在登錄 後創建新會話以修復會話固定。這應該被稱爲只有當用戶登錄到系統:登錄後創建新會話

//variables 
public class GenerteNewSessionFilter implements Filter { 

    public static final String NEW_SESSION_INDICATOR = "cab"; 

    // destroy 
    public void destroy() { 
     // TODO Auto-generated method stub 

    } 

    @SuppressWarnings({ "unchecked", "rawtypes" }) 
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 

     HttpServletRequest httpRequest = (HttpServletRequest) request; 
     if (httpRequest.getSession(false) != null && httpRequest.getSession(false).getAttribute(NEW_SESSION_INDICATOR) != null) { 

      // copy session attributes from new session to a map. 
      HttpSession session = httpRequest.getSession(); 

      // HashMap old = new HashMap(); 
      HashMap<String, Object> old = new HashMap<String, Object>(); 
      Enumeration keys = (Enumeration) session.getAttributeNames(); 
      while (keys.hasMoreElements()) { 
       String key = (String) keys.nextElement(); 
       if (!NEW_SESSION_INDICATOR.equals(key)) { 
        old.put(key, session.getAttribute(key)); 
        session.removeAttribute(key); 
       } 
      } 

      // invalidation session and create new session. 
      session.invalidate(); 
      session = httpRequest.getSession(true); 

      // copy key value pairs from map to new session. 
      for (Map.Entry entry : old.entrySet()) { 
       session.setAttribute((String) entry.getKey(), entry.getValue()); 
      } 
     } 
    } 

    // initiatiliazion 
    public void init(FilterConfig filterConfig) throws ServletException { 

    } 
} 

但我想只有一次,當用戶登錄到應用程序請指導我怎樣才能實現它執行它。

謝謝。

+0

如果您將該代碼放在處理用戶的憑證POST過程的地方,該怎麼辦?基本上,一旦您確認用戶是您認爲他們的人,就會使會話無效。 – 2014-08-29 23:26:41

回答

1

您可以將過濾器應用於特定的servlet。因此,僅將它應用於處理您的LoginAction的servlet,這樣它只會在用戶登錄時執行。

在您的web.xml只需更改過濾器路徑。
將您的<url-pattern>更改爲您的servlet的相同路徑。

<filter> 
    <display-name>SessionFilter</display-name> 
    <filter-name>SessionFilter</filter-name> 
    <filter-class>com.session.SessionFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>NewSessionFilter</filter-name> 
    <url-pattern>/your/path/LoginAction</url-pattern> 
</filter-mapping> 

或者使用<servlet-name>,而不是<url-pattern>

<filter-mapping> 
    <filter-name>SessionFilter</filter-name> 
    <servlet-name>LoginAction</servlet-name> 
</filter-mapping> 

注意你也可以申請<ulr-pattern>到JSP。
<url-pattern>/your/path/login.jsp</url-pattern>

+0

在這個應用程序中沒有servlet全部用於登錄我們有loginsubmit.jsp – aru 2014-08-29 15:08:30

+0

你如何檢查登錄?訪問數據庫以檢查用戶是否存在時,您使用什麼?而且你也有標籤servlet。 – user23123412 2014-08-29 15:12:28

+0

當用戶提交login.jsp時,它將用戶重定向到此jsp內的userloginsubmt.jsp,我們調用了用於訪問數據庫和驗證的java方法。 – aru 2014-08-29 15:51:05