怎么保证web网站的单点登录

    我们的网站在管理用户登录上一般都需要一个账号只能有一个人登录,那怎么才能实现呢?这里我介绍一种我在项目中使用的方法。用ServletContext实现。

首先我把思路分析一下:

1、用户登录成功以后,将此sessionid保存到ServletContext,在ServletContext中KEY值使用用户名,VALUE值使用当前的sessionid。

2、登录以后用户每次请求时,在拦截器中首先判断session是否过期,如果没有过期判断ServletContext中的sessionid是否是当前的sessionid,如果不是,说明该账号在其他地方登录。


一、用户登录以后将用户信息customerInfo放入SESSION中

    request.getSession(true).setAttribute("customerInfo", customerInfo);


二、将登录成功客户的SESSIONID保存到上下文ServletContext中

因为上下文ServletContext是整个web项目共享的对象,所以每个请求都一个

    String sessionId = session.getId();
    ServletContext servletContext = request.getServletContext();
    servletContext.setAttribute(loginName, sessionId);

三、在拦截器中判断session是否过期,ServletContext的sessionid是否已经被别人更新

        CustomerInfoDto customerInfo = (CustomerInfoDto) session.getAttribute("customerInfo");
        if(customerInfo == null) {
            StringBuffer json = new StringBuffer();
            String requestType =(String) request.getHeader("X-Requested-With");
            if (requestType != null && requestType.equals("XMLHttpRequest")) {
                response.setContentType("application/json;charset=UTF-8");
                json.append("{\"resultCode\":\"1\",\"resultMsg\":\"长时间未操作,请重新登录\"}");                
                PrintWriter pw = response.getWriter();   
                pw.print(json.toString());
                pw.close();
            }else{                
                response.sendRedirect(request.getContextPath() + "/login");
            }
            return false;
        }else{
            ServletContext servletContext = request.getServletContext();
            String loginSessionID = (String) servletContext.getAttribute(customerInfo.getLoginName());
            if(session.getId().equals(loginSessionID)){
                return true;
            }else{
                String requestType =(String) request.getHeader("X-Requested-With");
                if (requestType != null && requestType.equals("XMLHttpRequest")) {
                    response.setContentType("application/json;charset=UTF-8");            
                    PrintWriter pw = response.getWriter();   
                    pw.print("{\"resultCode\":\"1\",\"resultMsg\":\"该账号已在其它地方登录!\"}");
                    pw.close();
                }else{
                    response.sendRedirect(request.getContextPath() + "/login?error=1");
                }
            }
        }


这里有三个知识点需要注意:

1、拦截器在web.xml中的配置?

2、session的获取和存值方式?

3、ServletContext的获取和存值方式?



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值