总结一下我做的单点登录步骤

以前做的一个简单的单点登录,就是那种这面上线,另一面就直接踢下线的那种单点登录,不是一次登录各个系统都能用的那个单点哦

流程大概就是     先进行登录操作,然后把用户生成的session保存到一个map集合中,key只要你能找到一个唯一的用什么随便,value是session

对于这一个操作我写了一个监听具体代码如下

public class OnLineUserListenner implements HttpSessionAttributeListener{
	/***
	 * 只要向HttpSession中存放数据就会调用此方法
	 */
	@Override
	public synchronized void attributeAdded(HttpSessionBindingEvent httpSessionBindingEvent) {
		//获取session
		HttpSession session = httpSessionBindingEvent.getSession();
		//得到上下文
		ServletContext servletContext = session.getServletContext();
		//从session中获取user对象
		Object object = session.getAttribute(SystemConstants.IUSER);
		//判断是否是后台用户的User对象
		if(null != object && object instanceof User){
			//查询已有的信息
			Map<String, HttpSession> map = (Map<String, HttpSession>) servletContext.getAttribute(SystemConstants.IUSER);
			//判断是否为空。如果没有则新建
			if(null == map){
				map = new HashMap<String, HttpSession>();
			}
			//将用户的信息和session存储到map中
			map.put(((User)object).getLoginName(), session);
			//存入servletContext
			servletContext.setAttribute(SystemConstants.IUSER, map);
			//System.out.println("当前有"+map.size()+"个用户登陆-----------");
		}
	}
	/**
	 * 删除session的时候会调用此方法
	 */
	@Override
	public synchronized void attributeRemoved(HttpSessionBindingEvent httpSessionBindingEvent) {
		// TODO Auto-generated method stub
	}

	@Override
	public void attributeReplaced(HttpSessionBindingEvent arg0) {
		// TODO Auto-generated method stub
		
	}

}
以上代码是当你操作httpSession,添加数据时候调用,具体是怎么把用户的当前session和用户关联起来注释都有写就不墨迹了

然后就是当你需要踢掉登录的用户的时候需要的监听了

public class SessionListenner implements HttpSessionListener{

	@Override
	public void sessionCreated(HttpSessionEvent paramHttpSessionEvent) {
		// TODO Auto-generated method stub
		
	}
	/**
	 * session销毁的时候调用
	 */
	@Override
	public void sessionDestroyed(HttpSessionEvent paramHttpSessionEvent) {
		//获取sesssion
		HttpSession session = paramHttpSessionEvent.getSession();
//		System.out.println(session+"被销毁");
		//从session中获取user对象
		Object object = session.getAttribute(SystemConstants.IUSER);
		//判断是否是后台用户的User对象
		if(null != object && object instanceof User){
			//得到上下文
			ServletContext servletContext = session.getServletContext();
			//查询已有的信息
			Map<String, HttpSession> map = (Map<String, HttpSession>) servletContext.getAttribute(SystemConstants.IUSER);
			//如果不为空,清空改用户信息
			if(null != map){
				map.remove(((User)object).getLoginName());
			}
		}
	}

}

这个session销毁方法将在httpsession调用自己的invalidate方法时执行主要作用就是在保存这所有登录用户的session中删除掉当前要登出这个用户的session

到这里单点登录的主要类就完成了。然后就需要各位根据需要自己修改一下了,本文章仅供自己查看使用,别人使用出现问题,本人概不负责

还有一个附属的类,主要是用来完成调用注销session

public static void SignOut(HttpServletRequest request,
			HttpServletResponse response, User user) {
		// 获取session
		HttpSession session = request.getSession(true);
		// 得到上下文
		ServletContext servletContext = session.getServletContext();
		// 查询已有的信息
		Map<String, HttpSession> map = (Map<String, HttpSession>) servletContext
				.getAttribute(SystemConstants.IUSER);
		if (null != map) {
			//这里是找到了当前登录用户的session
                        HttpSession userSession = map.get(user.getLoginName());
			if (userSession != null) {
				// 清空用户session也就是销毁了当前用户的session
				userSession.invalidate();
				// 移除map中的用户和session
				map.remove(user.getLoginName());
			}
		}
	}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值