以前做的一个简单的单点登录,就是那种这面上线,另一面就直接踢下线的那种单点登录,不是一次登录各个系统都能用的那个单点哦
流程大概就是 先进行登录操作,然后把用户生成的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());
}
}
}