我正在研究的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 :(得分:2)
首先,您需要定义用户使用其他会话登录时应发生的情况。请记住,如果用户关闭浏览器,则服务器不通知,因此新会话甚至可以从重新启动同一浏览器。
鉴于此,我认为唯一有意义的方法是在用户再次登录时使用户的现有会话无效。
为此,您应该创建一个应用程序范围的属性(在ServletContext
上),其中包含用户到活动会话的映射。登录时,您将替换当前条目(如果有)。对于每个其他访问,如果当前会话不是活动会话,则重定向到登录页面。
答案 1 :(得分:1)
创建一个地图,其中userid作为键,会话对象作为值。每当收到登录请求时,首先在此映射中检查与用户ID相对应的值。如果该值不为null,则表示此用户已存在会话。因此要么使现有会话无效并创建新会话,要么使用前一个会话并向用户显示用户已登录的消息。要注意的是,每当用户注销时,必须删除其在地图中的条目。您可以使用sessioncontextlistener。