- 浏览: 1051596 次
- 性别:
- 来自: 郑州
文章分类
- 全部博客 (605)
- 数据挖掘 (22)
- spring (40)
- 工具使用 (39)
- java (137)
- JavaScript (40)
- webwork (12)
- web (120)
- 资源 (7)
- SSH (5)
- oracle (20)
- J2ME (1)
- 环境配置 (37)
- 项目管理 (29)
- mysql (14)
- struts (4)
- 项目总结 (27)
- ibatis学习 (33)
- 学习计划 (2)
- 缓存 (7)
- 重构 (3)
- Android (1)
- jquery (12)
- UML (3)
- 用户体验 (4)
- 习惯 (7)
- sakai (1)
- urlrewrite (4)
- rss (5)
- C plus plus (5)
- 算法 (5)
- 海量数据处理 (7)
- office(word、excel) (1)
- 面试题 (3)
- solr (8)
- 大数据 (2)
最新评论
-
hujin19861102:
截图看不见,最后一个webwrok的配置看不见
Ext+Webwork+Json 实现分页表格查询效果 -
蜗牛笔:
弱弱的问一句,要是分出来的词在词典中没有,那么两部分的pos- ...
ICTCLAS 中科院分词系统 -
weipeng1986:
授人予鱼不如授人予鱼,我想问你的是你是怎么总结的。比如第四种情 ...
JAVA中字符串连接效率的测试 -
xiaoqiang2008:
执行两次的原因是什么,好像楼主没弄清楚啊!是不是在web.xm ...
关于Spring中用quartz定时器在定时到达时同时执行两次的问题 -
Kent_Mu:
...
ibatis-dynamic的用法
解决在线用户列表和重复登录
解决两个问题:
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. 实现在线用户列表
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. 登录部分============================
Java代码
//先从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);
//先从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);
Java代码
//先从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);
//先从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. 监听部分============================
Java代码
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);
}
}
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);
}
}
Java代码
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);
}
}
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. 过滤部分============================
Java代码
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);
}
}
Java代码
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);
}
}
发表评论
-
fork/join框架
2017-03-09 11:03 498http://blog.csdn.net/ye1992/art ... -
protobuffer
2017-03-09 10:54 695http://blog.csdn.net/antgan/art ... -
整理上传代码容易忽略的注意事项
2013-08-31 11:28 1161每个公司都有自己的代码代码上传流程:如果打包发布的话,是不存 ... -
mysql版本升级引发的问题
2013-05-16 15:25 1655问题描述: 1. ibatis 中 mysql语 ... -
网站的记住密码功能设计
2013-02-27 19:09 1308http://greenyouyou.blog.163 ... -
大型网站架构演变之路
2013-02-27 19:08 1147http://www.cnblogs.com/ivanjack ... -
使用Filter统计Java(J2EE)的web程序http请求响应时间
2013-02-27 19:07 1389http://www.cnblogs.com/ivan ... -
java bean与xml相互转换
2013-02-06 10:27 2048最近在做的项目,在各个平台之间需要大量传输数据,且结构比较 ... -
java 反射
2013-01-14 18:21 830http://www.cnblogs.com/rollenh ... -
字符串替换
2012-12-17 11:17 1160高效的字符串模式替换实现效果如下 String str ... -
httpURLConnection获取网络数据:XML格式返回与Json格式返回
2012-12-15 16:57 149251.服务器端代码样例: public class ... -
利用Freemarker实现表到功能界面的一键生成
2012-11-22 18:03 1020利用Freemarker实现表到功能界面的一键生成 h ... -
ibatis in ##的问题
2012-11-02 13:25 854http://www.hake.cc/a/biancheng/ ... -
ibatis缓存强制刷新与命中率
2012-10-19 19:06 1393缓存强制刷新: // spring注入 private Sq ... -
eclipse 的一些设置
2012-08-16 22:06 17611. 控制台信息太多,程序跑完后只能保留最后的一部分之前的 ... -
jdk1.5 System.arraycopy与jdk1.6 中Arrays.copyOf()&Arrays.copyOfRange()
2012-08-16 21:56 3288在JDK1.5的类System类中有方法 ... -
Eclipse报Java heap space错误的解决方案
2012-08-16 16:43 12072当运行大数量的数据时: (1) 如果是java 应用程 ... -
求两个字符串的最大公共字符串
2012-08-10 20:41 1064http://blog.csdn.net/wangcj625/ ... -
ffmpeg 截取视频 播放中的图片
2012-06-19 09:14 1315http://www.cnblogs.com/live365w ... -
memcached 项目中的使用
2012-06-13 09:29 1066http://ljh2008.iteye.com/blog/6 ...
相关推荐
总结来说,`.NET C# 利用session控制用户重复登录及统计在线用户数解决方案`主要是: 1. 用户登录时,将用户信息存入`Session`,同时设置登录状态和计数器。 2. 检查`Session`中的登录状态以防止重复登录。 3. 使用...
总结,防止用户重复登录是现代应用程序中一个重要的安全特性,涉及到多方面的技术和策略。通过合理的设计和实施,可以有效地提升系统的安全性,同时兼顾用户体验。对于开发者而言,理解这些概念和方法,并灵活应用到...
### 用户重复登录问题详解与解决方案 #### 一、问题背景及需求分析 在现代网络应用中,用户登录安全性和用户体验是非常重要的。一个常见的问题是:如何防止用户在一个客户端登录后,在另一个客户端进行重复登录?...
为了解决用户重复登录的问题,我们可以采取以下策略: 1. **会话管理**:在用户登录时,可以使用Session或Application变量来记录用户的登录状态。当用户在其他地方再次登录时,检查这个状态并终止原来的会话。 2. ...
### Freeradius 2.1.3 防止用户账号重复登录 #### 知识点一:Freeradius简介及版本说明...综上所述,通过以上步骤,我们可以在Freeradius 2.1.3中成功配置防止用户账号重复登录的功能,从而提升系统的安全性与稳定性。
这通常涉及到用户尝试登录时,系统如何处理已存在的在线会话,特别是在多设备、多窗口或浏览器标签页同时登录的情况下。本篇文章将深入探讨如何在Java环境中解决这个问题。 首先,理解登录的基本流程:用户输入...
这个系统解决了用户重复登录的问题,确保了用户体验的顺畅性和安全性。以下是关于这个系统的详细知识点: 1. **Servlet**: Servlet是Java中用于处理HTTP请求的服务器端组件,是JavaWeb开发的核心部分。在登录注册...
.NET中的Session管理和防止用户重复登录是一个关键的安全策略,它确保了每个用户只能同时在一个设备上进行登录操作。本文将详细探讨如何使用.NET框架解决这些问题,特别是通过配置`web.config`和编写`Global.asax`...
综上所述,解决Web程序多台机器重复登录问题需要从会话管理策略、服务器配置和兼容性优化等多个角度出发。理解并选择合适的会话管理方案,以及针对特定浏览器的适配,是构建健壮、高可用Web应用的关键。在实际开发中...
MyEclipse+mysql+Ajax工具,解决用户同一时段不能重复登录,第二次登录将会挤掉第一次登录用户,弹出消息框(你已在其他地方登录,被迫下线),我也是借鉴其他大师 然后自己整理的。基本逻辑是:用户登录时候检测...
5. **更新在线状态:** 登录成功后,更新用户的在线状态,包括登录时间和IP地址等。 ```vbscript Sub isOK(userName) Dim OLip, Oltime, OLip1 OLip1 = Request.ServerVariables("REMOTE_ADDR") ' 更新在线...
1、在负载均衡以及单服务器部署模式下面解决同一个账户不能重复登录问题,如果重复登录则之前会话失效. 2、只提供负载均衡情况下避免账户重新登录解决方案。在线人数统计也可以参考这种方法实现,未做具体描述。
在Java Web开发中,防止多用户重复登录是一个重要...总之,通过在`application`作用域中管理登录信息并结合`session`监听器,可以有效地实现Java Web应用程序中防止多用户重复登录的功能,提高系统的安全性和用户体验。
此外,ChatGPT 技术还可以借助推理能力来解决用户提问的重复问题。推理是智能助手解决问题的重要方式之一。ChatGPT 技术可以利用推理引擎来分析问题中的逻辑关系和语义信息,通过推理得出正确的答案。当用户提出重复...
总的来说,通过session监听,我们可以有效地解决S2SH框架下的用户重复登录问题,保证系统的稳定性和安全性。不过,随着技术的发展,现代Web应用可能会使用更高级的解决方案,例如JWT(JSON Web Tokens)进行身份验证...
**场景说明**:重复提交和刷新通常发生在用户操作过程中,特别是在提交表单后,如果用户不知道操作是否成功完成,可能会尝试刷新页面或重复点击提交按钮,这就会导致数据被重复提交到服务器。 **是否需要处理**:...
在Web开发中,防止用户刷新页面...综上所述,本资源提供的代码和说明可以帮助开发者理解并实施防止用户刷新重复提交数据的机制,通过使用Token,可以有效地保护Web应用免受重复操作的困扰,提高系统的稳定性和安全性。
在Java Web开发中,用户登录和注销功能是核心部分,而用户注销后点击浏览器的返回按钮,导致页面刷新并重新登录的问题是一个常见的困扰。这个问题的出现主要是由于浏览器缓存了用户登录时的表单信息,当用户注销后,...