允许每个用户有一个会话



我正在开发的web应用程序在Tomcat服务器上运行JSP和JAVA。怎么可能只允许每个用户一次只有一个会话,这意味着不允许任何用户从同一台或其他机器/浏览器登录多个会话。

JSP客户端:
<input type="text" name="uname" placeholder="Username"> <br>
<input type="password" name="pwd" placeholder="Password"> <br>

<input type="submit" value="Login">
<% String fail = request.getParameter("loginFailed");

    if(fail != null && fail.equals("yes"))
    {
        out.println("<br><font color="red"> Login failed</font>");
    }
    else if(request.getParameter("loggedOut") != null)
    {
        out.println("<br><font color="red">You have been logged out.</font>");
    }
    %>

JAVA Part:

public class login extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
 * @see HttpServlet#HttpServlet()
 */
public login() {
    super();
    // TODO Auto-generated constructor stub
}
/**
 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
 */
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub
    String[] uname = request.getParameterValues("uname");
    String[] pass = request.getParameterValues("pwd");
    if( uname.length == 0 || pass.length == 0)
    {
        response.sendRedirect("/MASC/index.jsp?loginFailed=yes");
        return;
    }
    UsersDB authdb = new UsersDB();
    User authUser = null;
    try {
        authUser = authdb.auth(uname[0], pass[0]);
    } catch (NoSuchAlgorithmException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    if(authUser == null)
    {
        response.getWriter().append("not authenitacted");
        Cookie authCookie = new Cookie("auth", "no");
        response.addCookie(authCookie);
        response.sendRedirect("/MASC/index.jsp?loginFailed=yes");
    }
    else
    {
        System.out.println("auth session  " + authUser);
        HttpSession session = request.getSession();
        session.setAttribute("uid", authUser.getUid());
        session.setAttribute("level", authUser.getLevel());
        session.setAttribute("aeid", authUser.getAeid());
        session.setMaxInactiveInterval(15*60);
        response.sendRedirect("/MASC/welcome.jsp");
    }

}
/**
 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
 */
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub
    doGet(request, response);
}

是否有一种方法来存储登录的用户,或者在数据库"Loggedin"中创建一个新列,并在允许用户登录之前检查该列?或者有没有更有效的方法来实现呢?

首先,您需要定义当用户使用不同的会话登录时应该发生什么。请记住,如果用户关闭了浏览器,您的服务器将不会收到通知,因此新的会话甚至可以从重新启动同一浏览器开始。

考虑到这一点,我认为唯一有意义的方法是,当用户再次登录时,使用户现有的会话无效。

要做到这一点,您应该创建一个应用程序范围的属性(在ServletContext上),其中包含用户到活动会话的映射。登录时,替换当前条目(如果有的话)。对于所有其他访问,如果当前会话不是活动会话,则重定向到登录页面。

创建一个以userid为键,以会话对象为值的映射。每当收到登录请求时,首先在此映射中检查与用户id对应的值。如果该值不为空,则表示该用户已经存在会话。因此,要么使现有会话无效并创建一个新会话,要么使用以前的会话并向用户显示用户已经登录的消息。需要注意的是,每当用户注销时,必须删除其在映射中的条目。您可以使用sessioncontextlistener

相关内容

最新更新