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

同一个账号,同一时刻,只能使用一个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>

本次代码到此结束。


  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值