2015-09-21 82 views
0

我正在使用的webapp在運行在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部分:

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

如果您選擇使用spring安全性,則它具有稱爲併發控制的功能,該功能控制允許用戶具有的併發會話數。 – user2953113

回答

2

首先,您需要定義用戶使用其他會話登錄時應該發生的情況。記住,如果用戶關閉瀏覽器,你的服務器是而不是通知,所以一個新的會話甚至可以從重新啓動同一個瀏覽器。

鑑於此,我認爲唯一有意義的方法是在用戶再次登錄時使用戶的現有會話無效。

爲此,您應該創建一個應用程序範圍的屬性(位於ServletContext),其中包含用戶到活動會話的映射。登錄時,如果有,則替換當前條目。對於其他訪問,如果當前會話不是活動會話,則重定向到登錄頁面。

1

使用userid作爲鍵和會話對象作爲值創建映射。每當接收到登錄請求時,首先在該映射中檢查與用戶標識對應的值。如果該值不爲空,則表示此用戶的會話已存在。因此,要麼使現有會話失效並創建一個新會話,要麼使用前一個會話,並向用戶顯示該用戶已登錄的消息。需要注意的是,無論何時註銷用戶,都必須刪除其在地圖中的條目。你可以爲此使用sessioncontextlistener。

相關問題