同一个账号,同一时刻,只能使用一个IP.登陆。

分享一些本人在开发项目中得到的一点心得。
首先,大家在登录账号的时候如果在其他地方已经登录该账号,那么会遇到该账户已登录这种情况,在下写了一个非常简单的demo来实现这个功能,这就给大家做一个非常简单的演示。


首先说下大概流程:

每次登录将当前的session,与登录的邮箱(账号),放到一个map容器中,即:Map < String, HttpSession>

当其他用户再次登录时,查找map中是否存在该邮箱(账号),如果存在,说明该账号已经登录,跳转到登录页面,并显示该账户已经登录。如果map中不存在,则将当前session与对应的邮箱(账号),放到map中。等到session正常销毁时,将map中该session与其对应的邮箱(账号)移除。(前提邮箱密码全正确)

iOS 可以使用一个账号证书上架到另外一个账号吗_只能同时一个IP

代码块

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>

本次代码到此结束。