使用HttpSessionBinding事件跟踪用户登录会话

时间:2015-09-30 11:15:20

标签: java session servlets

我想跟踪用户会话以检查同一用户的多次登录

我的网络应用程序的执行如下

在下面的 ServletContextListener 中,我正在初始化 java.util.Set 来存储所有活动用户,我将它设置为ServletContext对象,以便它应该是适用于整个网络应用

@WebListener
public class InitilizationClass implements ServletContextListener {

    /**
     * Default constructor. 
     */
    public InitilizationClass() {
        // TODO Auto-generated constructor stub
    }

    /**
     * @see ServletContextListener#contextDestroyed(ServletContextEvent)
     */
    public void contextDestroyed(ServletContextEvent arg0)  { 
         // TODO Auto-generated method stub
    }

    /**
     * @see ServletContextListener#contextInitialized(ServletContextEvent)
     */
    public void contextInitialized(ServletContextEvent arg0)  { 
         // TODO Auto-generated method stub
        System.out.println("Setting initialization parameters");
        Set<ActiveUser> allusers = new HashSet<ActiveUser>();
        ServletContext sc = arg0.getServletContext();
        sc.setAttribute("logins", allusers);
    }

}

以下是我的 Servlet 代码。当用户输入用户名和密码时,用户名将设置为 ActiveUser 类,即 HttpSessionBindingListener 。初始化HttpSession以将ActiveUser对象存储在会话中。

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username=request.getParameter("username");
        String password=request.getParameter("pass");

                             ActiveUser user = new ActiveUser();
                             user.setUserName(username);
                             HttpSession session = request.getSession();
                             if(session.isNew())
                             {
                                 session.setAttribute("userlogged", user);
                             }
                             else
                             {
                                 session.setAttribute("userlogged", user);
                             }

    }

现在上面 Servlet 中的setAttribbute将调用以下类中的valueBound方法。在此方法中,如果Set为空,则ActiveUser对象将添加到Set中。但如果它是具有相同凭据的同一用户的第二次登录,则它应该仅显示消息为&#34;用户已经使用名称(其用户名)&#34;登录。

public class ActiveUser implements HttpSessionBindingListener {

    private String username = null;
    private String password = null;

    public void setUserName(String uname)
    {
        this.username = uname;
    }

    public String getUserName()
    {
        return this.username;
    }

    @Override
    public void valueBound(HttpSessionBindingEvent arg0) {
        // TODO Auto-generated method stub

        ServletContext sc = arg0.getSession().getServletContext();
        ActiveUser session = (ActiveUser) arg0.getSession().getAttribute("userlogged");
        Set<ActiveUser> user = (Set<ActiveUser>) sc.getAttribute("logins");
        if(user.isEmpty())
        {
            System.out.println("A user session has been created");
            user.add(session);
            sc.setAttribute("logins", user);
        }
        else
        {

            for(ActiveUser users : user)
            {
                System.out.println("Names "+users.getUserName()); // Null Pointer Exception
                if(session.getUserName().equals(users.getUserName()))
                {
                    user.remove(users);
                    System.out.println("User already logged in with name "+users.getUserName());
                }
            }
        }
    }

    @Override
    public void valueUnbound(HttpSessionBindingEvent arg0) {
        // TODO Auto-generated method stub

    }

}

我在行

上得到一个空指针异常
System.out.println("Names "+users.getUserName());
第二次登录

1 个答案:

答案 0 :(得分:0)

 for(ActiveUser users : user)
            {
                System.out.println("Names "+users.getUserName()); // Null Pointer Exception
                if(session.getUserName().equals(users.getUserName()))

我认为这行更有可能

session.getUserName().equals(users.getUserName())

是投掷NPE的人。这是因为当将任何属性添加到会话时,将调用valueBound方法,而不仅仅是您要查找的属性。因此,请检查您的特定属性

 public void valueBound(HttpSessionBindingEvent arg0) {
      String attr = (String)arg0.getValue();
      if("userlogged".equals(attr){
               //do your stuff here
      }
 }

其他一些与此无关的事情

  1. 以下代码毫无意义
  2.   如果

    (session.isNew())                                {                                    session.setAttribute(&#34; userlogged&#34;,user);                                }                                其他                                {                                    session.setAttribute(&#34; userlogged&#34;,user);                                }

    1. 如果应用程序部署在群集中,此技术将永远不会起作用。