2015-09-21 4 views
0

В webapp, над которым я работаю, работает JSP и JAVA на сервере Tomcat. Как можно разрешить только каждому пользователю иметь только один сеанс за раз, то есть не позволять любому пользователю подписываться более чем на одном или другом компьютере или браузере.Разрешить каждому пользователю иметь один сеанс

сторона 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 Часть:

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» и проверка для этого столбца, прежде чем разрешить пользователю входить в систему? Или есть более эффективный способ реализовать это?

+0

Если вы решите использовать функцию весны, у нее есть функция, называемая контролем параллелизма, которая контролирует количество одновременных сеансов, которые пользователь может иметь. – user2953113

ответ

2

Во-первых, вам нужно определить, что должно произойти, когда пользователь входит в систему, используя другой сеанс. Помните, что если пользователь закрыл браузер, ваш сервер будет не уведомлен, поэтому новый сеанс может быть даже от перезапуска того же браузера.

Учитывая, что, я думаю, единственный способ иметь смысл - аннулировать существующий сеанс пользователя, когда пользователь снова войдет в систему.

Для этого вы должны создать атрибут области приложения (по адресу ServletContext) с картой пользователя для активного сеанса. При входе в систему вы заменяете текущую запись, если таковая имеется. Для каждого другого доступа, если текущий сеанс не является активным сеансом, перенаправление на страницу входа.

1

Создайте карту с идентификатором пользователя как ключ и объект сеанса как значение. Всякий раз, когда принимается запрос на вход, сначала проверьте на этой карте значение, соответствующее идентификатору пользователя. Если значение не равно null, это означает, что сеанс уже существует для этого пользователя. Таким образом, либо аннулируйте существующий сеанс, либо создайте новый, либо используйте предыдущий, и покажите сообщение пользователю, что пользователь уже зарегистрирован. Следует отметить, что всякий раз, когда пользователь выходит из системы, его запись на карте должна быть удалена. Для этого вы можете использовать sessioncontextlistener.

Смежные вопросы