同一个账号,同一时刻,只能使用一个IP.登陆。
分享一些本人在开发项目中得到的一点心得。
首先,大家在登录账号的时候如果在其他地方已经登录该账号,那么会遇到该账户已登录这种情况,在下写了一个非常简单的demo来实现这个功能,这就给大家做一个非常简单的演示。
首先说下大概流程:
每次登录将当前的session,与登录的邮箱(账号),放到一个map容器中,即:Map < String, HttpSession>
当其他用户再次登录时,查找map中是否存在该邮箱(账号),如果存在,说明该账号已经登录,跳转到登录页面,并显示该账户已经登录。如果map中不存在,则将当前session与对应的邮箱(账号),放到map中。等到session正常销毁时,将map中该session与其对应的邮箱(账号)移除。(前提邮箱密码全正确)
代码块
1.获取到用户的账号密码,为了简单起见就不去数据库中取账号密码的值了;
public class test
{
public String getAcount()
{
String Acount="你的账号";
return Acount;
}
public String getPassword()
{
String Acount="你的密码";
return Acount;
}
}
2.设置session监听器,当session正常销毁时,获取session,如果不为空,从map中移除session和其对应的邮箱。
public class MySessionListner implements HttpSessionListener
{
public static Map<String, HttpSession> map=new HashMap<String, HttpSession>();
@Override
public void sessionCreated(HttpSessionEvent arg0)
{
//session创建时候执行
System.out.println("session创建了");
}
@Override
public void sessionDestroyed(HttpSessionEvent httpSessionEvent)
{
//session销毁执行
System.out.println("我session销毁了");
HttpSession session = httpSessionEvent.getSession();
if(session!=null)
{
AdminJavaBean adminJavaBean=(AdminJavaBean) session.getAttribute("Passcheck");
map.remove(adminJavaBean.getEmail());
}
}
}
3.当用户再次登录时,查找map中是否存在该邮箱(账号),如果存在,说明该账号已经登录,跳转到登录页面,并显示该账户已经登录。如果map中不存在,则将当前session与对应的邮箱(账号),放到map中。(前提邮箱密码全正确)ps:邮箱登录验证代码,博主未写。
public class Adminseverlet extends HttpServlet
{
@Override
public void init() throws ServletException
{
System.out.println("我初始化了");
}
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
// AdminJavaBean 为存放账户信息的pojo,即对应数据库字段的javabean。
AdminJavaBean adminJavaBean = new AdminJavaBean();
// 判断map中是否存在该邮箱(账户)
if (MySessionListner.map.get(adminJavaBean.getEmail()) != null)
{
String info = "账户已在其他地方登录";
request.setAttribute("info", info);
request.getRequestDispatcher("Login.jsp").forward(request, response);
} else
{
HttpSession session = request.getSession();
MySessionListner.map.put(adminJavaBean.getEmail(), session);
}
}
}
4.session监听器以及servlet对应的web.xml配置,< listener-class>标签内为MySessionListner所在的包名加类名。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<servlet>
<servlet-name>Adminseverlet</servlet-name>
<servlet-class>com.carlinfo.AdminiSevertlet.Adminseverlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Adminseverlet</servlet-name>
<url-pattern>/Adminseverlet</url-pattern>
</servlet-mapping>
<listener>
<listener-class> com.carlinfo.AdminiSessionListner.MySessionListner </listener-class>
</listener>
</web-app>
本次代码到此结束。