解决两个问题:
1. 实现在线用户列表
2. 当用户在异地登录后,使前一次登录自动退出
实现方法:
用户登录时,会创建一个session,用于保存用户信息。将所有用户登录时的session值与ID存入ServletContext中,显示在线列表的时候,就从ServletContext中取得用户登录的session值,从中取得用户信息。
1. 登录:
先从ServletContext中取出存放用户登录的session 相关信息,检查这个列表,如果已经存在相同的登录信息,则说明用户之前已经登录过,移除前面一条记录。
再把此次登录的信息加入到ServletContext中。
2.监听:
实现SessionListener类,当session失效的时候,从ServletContext中移除相应记录。
3.过滤:
过滤所有页面,sesison失效后转向登录页面。但是要实现用户二次登录后强制先前的登录失效,需要在这里控制。
登录时存入的是session值和session ID,用户二次登录时移除了前线记录,存入的session值是相同的,但是ID却不同。
当第一次登录的页面请求的时候,在这里检查ServletContext中是否存在当前的session值与ID记录。如果没有就销毁这个session。
参考代码:
存放的时候有很多中方法,我选择的是将session值与ID先存入一个List,在将这个List存入另一个List,再存到ServletContext中。
代码仅供参考,有不合理的地方,希望大家给出意见。
============================1. 登录部分============================
//先从ServletContext中获得存放sessioninfo的List
List userlist = (List) this.servlet.getServletContext()
.getAttribute("userlist");
//如果是首个用户登录,sessionlist为空,new一个
if (userlist == null) {
userlist = new ArrayList();
}
//遍历List
for (int i = 0; i < userlist.size(); i++) {
List sessionInfoTemp = (List) userlist.get(i);
//检查是否存在一个与当前session值相同,但是ID不同的记录
if(sessionInfoTemp.get(0).toString().equals(session.getAttribute("emp").toString())&& !(sessionInfoTemp.get(1).equals(session.getId()))) {
//如果存在,remove这一记录
userlist.remove(sessionInfoTemp);
}
}
// 把session值、ID 存入 sessioninfo
List sessioninfo = new ArrayList();
sessioninfo.add(session.getAttribute("emp"));
sessioninfo.add(session.getId());
//sessioninfo 存入 List
userlist.add(sessioninfo);
//List存入ServletContext
this.servlet.getServletContext().setAttribute("userlist", userlist);
============================2. 监听部分============================
public void sessionDestroyed(HttpSessionEvent arg0) {
// TODO Auto-generated method stub
HttpSession session = arg0.getSession();
if(session.getAttribute("emp")!=null){
List list = (List)session.getServletContext().getAttribute("userlist");
List userTemp = new ArrayList();
userTemp.add(session.getAttribute("emp"));
userTemp.add(session.getId());
list.remove(userTemp);
session.getServletContext().setAttribute("userlist", list);
}
}
============================3. 过滤部分============================
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
HttpSession session = request.getSession();
/**
* 同一用户二次登陆问题 用户请求的提交到这里,通过检查List总的记录销毁session
*/
// 从ServletContext中取出List
List sessionlist = (List) session.getServletContext().getAttribute(
"userlist");
if (sessionlist == null) {
sessionlist = new ArrayList();
}
// 用于记录状态
boolean temp = false;
Iterator it = sessionlist.iterator();
while (it.hasNext()) {
List sessioninfo = (List) it.next();
/**
* 判断: 如果sessioninfo中没有当前session的值与ID信息,则表明该用户已经第二次登陆了
* 登陆的时候第一次登陆时候的信息被从List中移除了。
*/
if (sessioninfo.get(0).toString().equals(
session.getAttribute("emp").toString())
&& sessioninfo.get(1).equals(session.getId())) {
// session值与当前ID匹配
temp = true;
}
}
// 存在了第二次登陆,销毁session
if (!temp) {
session.invalidate();
}
String strSession = null;
try {
strSession = session.getAttribute("emp").toString();
} catch (Exception e) {
}
/**
* 如果session为空,返回登陆页面
*/
if (strSession == null) {
response.setCharacterEncoding("gb2312");
response
.getOutputStream() .print("<script>window.top.location.href='/index.jsp';alert('超时或账号在其它地方登录,请重新登录!');</script>");
} else {
chain.doFilter(req, res);
}
}
分享到:
相关推荐
该例程利用session全面解决了用户在线数量统计及控制用户重复登录。
对于用户重复登录的情况做了详细的介绍,提供了解决办法,个人认为此文档还可以
C#防用户重复登录的方法.NET;解决用户在同一台电脑重复登录问题
该例程利用session全面解决了用户在线数量统计及控制用户重复登录。
MyEclipse+mysql+Ajax工具,解决用户同一时段不能重复登录,第二次登录将会挤掉第一次登录用户,弹出消息框(你已在其他地方登录,被迫下线),我也是借鉴其他大师 然后自己整理的。基本逻辑是:用户登录时候检测...
1、在负载均衡以及单服务器部署模式下面解决同一个账户不能重复登录问题,如果重复登录则之前会话失效. 2、只提供负载均衡情况下避免账户重新登录解决方案。在线人数统计也可以参考这种方法实现,未做具体描述。
javaweb登入注册+答题系统 解决了反之用户重复登陆:servlet+json+ajax+js
在web项目开发中,很多情况下都可以让同一个账号信息在不同的...一般解决这种情况有两种解决方案,小编呢主要以第二种方式给大家介绍具体的实现方法,对java web 防止多用户重复登录的解决方案感兴趣的朋友一起看看吧
主要介绍了javaweb用户注销后点击浏览器返回刷新页面重复登录问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
关于项目设置时间限制的问题,sessionstate timeout
SQL server临时表是经常需要用到的,下面就教您如何使用SQL server临时表解决防止用户重复登录问题,供您参考。 在我们开发商务软件的时候,常常会遇到这样的一个问题:怎样防止用户重复登录我们的系统?特别是对于...
Java解密代码 解决Eclipse中需要多用户注册问题
如何修改禁止多次重复提交
正对java Web项目,同浏览器同时打开两个登录窗口(不同Tag),用不同用户登录,为避免使用同一个Session,需要使用这段代码。否则先登录的用户的Session会变成后登录用户的Session.相关系统使用权限也会变。
C#两个账号同时登录,后登录的账号将前一个账号挤掉C#两个账号同时登录,后登录的账号将前一个账号挤掉
Java学生管理系统(控制台)实现了学生姓名,学号,居住地,年龄的添加,...解决了学号的重复问题,不存在的问题等。为个人原创作品。内有详细注释,可供使用。 文件编码格式为gbk,如有乱码,请调整编译器的编码格式。
服务器端避免表单的重复提交,利用同步令牌来解决重复提交的基本原理如下:(1)用户访问提交数据的页面,服务器端在这次会话中,创建一个session对象,并产生一个令牌值,将这个令牌值作为隐藏输入域的值,随表单一起发送到...
不过,利用天猫长期积累的用户行为日志,我们或许可以解决这个问题。 我们提供了一些商家信息,以及在“双十一”期间购买了对应产品的新消费者信息。你的任务是预测给定的商家中,哪些新消费者在未来会成为忠实客户...