2014-08-29 147 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