我想跟踪用户会话以检查同一用户的多次登录
我的网络应用程序的执行如下
在下面的 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());
第二次登录
答案 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
}
}
其他一些与此无关的事情
如果(session.isNew()) { session.setAttribute(&#34; userlogged&#34;,user); } 其他 { session.setAttribute(&#34; userlogged&#34;,user); }