- 浏览: 1090709 次
文章分类
- 全部博客 (379)
- S2SH (16)
- stuts2 (0)
- java语言 (81)
- JSP (17)
- <html>元素 (11)
- javaweb (4)
- web容器 (3)
- ext (23)
- javaScript (48)
- ant (1)
- liferay (1)
- sql (9)
- css (42)
- 浏览器设置 (3)
- office_world (1)
- eclipse (4)
- 其它 (28)
- 操作系统 (5)
- android (6)
- Struts2 (11)
- RegEx (3)
- mysql (5)
- BigDATA (1)
- Node.js (1)
- Algorithm (10)
- Apache Spark (1)
- 数据库 (5)
- linux (2)
- git (1)
- Adobe (3)
- java语言,WebSocket (1)
- Maven (3)
- SHELL (1)
- XML (2)
- 数学 (2)
- Python (2)
- Java_mysql (1)
- ReactJS (6)
- 养生 (4)
- Docker (1)
- Protocols (3)
- java8 (2)
- 书籍 (1)
- Gradle (2)
- AngularJS (5)
- SpringMVC (2)
- SOAP (1)
- BootstrapCSS (1)
- HTTP协议 (1)
- OAuth2 (1)
最新评论
-
Lixh1986:
Java并发编程:自己动手写一把可重入锁https://blo ...
Java之多线程之Lock与Condition -
Lixh1986:
http://win.51apps.com.cn/https: ...
temp -
ztwsl:
不错,支持很好
HttpServletRequest和ServletRequest的区别 -
guodongkai:
谢谢您能将知识精华汇编总结,让初学者们从原理中学会和提高。
javaScript之function定义 -
kangwen23:
谢谢了,顶顶
struts2中的ValueStack学习
单用户登录是系统中数据一直性的解决方案之一。
问题背景:
试想,如果同时有两个用户使用一个账号登录系统,
他们两个人需要对一批文章进行编辑。
都已经把同一篇文章读取到了浏览器中各自进行编辑后提交,
那么就会出现该文章只会保存一个人提交的结果。
先提交的那个人的将会被覆盖掉。
核心思想:
背景:由于每次请求的 sessionId 都不一样。
确保:每个用户名只能对应一个 session
方法:
在全局变量中维护一个 session 列表。
如果相同的用户名,出现不一样的 sessionId,
说明该用户进行了第二次登录,
则使原来存在的 session 失效(移除 session )。
页面可以加轮询次数(时间)控制,
无需等到用户下一次手动提交请求。
1、第一次登陆成功
说明:
这里不用把整个session放到全局变量中,
可以只放一个 seesionId 即可。
2、拦截器拦截每一个请求路径,判断用户是否已经在别处登录
3、前台ajax轮询用户当前状态
4、清除当前session信息
5、监听器
-
问题背景:
试想,如果同时有两个用户使用一个账号登录系统,
他们两个人需要对一批文章进行编辑。
都已经把同一篇文章读取到了浏览器中各自进行编辑后提交,
那么就会出现该文章只会保存一个人提交的结果。
先提交的那个人的将会被覆盖掉。
核心思想:
背景:由于每次请求的 sessionId 都不一样。
确保:每个用户名只能对应一个 session
方法:
在全局变量中维护一个 session 列表。
如果相同的用户名,出现不一样的 sessionId,
说明该用户进行了第二次登录,
则使原来存在的 session 失效(移除 session )。
页面可以加轮询次数(时间)控制,
无需等到用户下一次手动提交请求。
1、第一次登陆成功
String userIdDecode = "登陆名"; ServletContext context=null; context = this.getSession().getServletContext(); HttpSession session = this.getSession(); Map<String,HttpSession> usersMap = (Map<String, HttpSession>) context.getAttribute("usersMap"); //第一个用户登录时 if(usersMap == null){ usersMap = new HashMap<String,HttpSession>(); usersMap.put(userIdDecode, session); context.setAttribute("usersMap", usersMap); //将用户保存到ServletContext对象中 //非第一个用户登录 }else{ if(usersMap.containsKey(userIdDecode)){ logger.info("第二次登陆,remove掉"+userIdDecode); usersMap.remove(userIdDecode); } logger.info("添加当前用户到map"+userIdDecode); usersMap.put(userIdDecode, session); } this.setSessionValue("user", userIdDecode);
说明:
这里不用把整个session放到全局变量中,
可以只放一个 seesionId 即可。
2、拦截器拦截每一个请求路径,判断用户是否已经在别处登录
//获取用户信息 HttpSession session = this.getSession(); String user = (String)session.getAttribute("user"); System.out.println("当前登陆用户:"+user+"当前用户的sessionId"+session.getId()); Map<String,HttpSession> usersMap = (Map<String, HttpSession>) session.getServletContext().getAttribute("users"); if(null != usersMap){ if(null == user){ result = ""; return null; } if(usersMap.containsKey(user)){ if(session.getId().equals(usersMap.get(user).getId())) result = "true"; else result = "false"; }else { if(null==usersMap.get(user)) result = "true"; else result = "false"; } }else{ result = ""; } try { ServletActionContext.getResponse().getWriter().print(result); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; }
3、前台ajax轮询用户当前状态
//如果是在首页结束轮询 var countTimeOut = 0; //轮询当前用户 var t2 = window.setInterval("loadXMLDoc()",1000); function loadXMLDoc() { countTimeOut = countTimeOut+1; if(countTimeOut == 1800){ $.ajax({ type:"post", url:"cleanSession", dataType : "text", error:function(){ window.location.href="http://toIndex.action"; } }); } $.ajax({ type:"post", url:"sessionLive", dataType : "text", success:function(data){check(data)}, error:function(){ window.location.href="http://toIndex.action"; } }); } function check(result){ if(result=="true"){ }else{ if(result=="false"){ alert("您已经在别处登陆"); $.ajax({ type:"post", url:"cleanSession", dataType : "text", error:function(){ window.location.href="http://toIndex.action"; } }); window.location.href="http://toIndex.action"; }else{ clearInterval(t2); } } } //轮询当前用户结束
4、清除当前session信息
//获取用户信息 String user = (String)this.getSession().getAttribute("user"); Map<String,HttpSession> usersMap = new HashMap<String, HttpSession>(); HttpSession session = this.getSession(); usersMap = (Map<String, HttpSession>)session.getServletContext().getAttribute("users"); if(null != usersMap){ if(usersMap.containsKey(user)){ if(session.getId().equals(usersMap.get(user).getId())) { usersMap.remove(user); } }} this.getSession().invalidate();
5、监听器
application = event.getSession().getServletContext(); Map<String,HttpSession> usersMap = new HashMap<String, HttpSession>(); HttpSession session = event.getSession(); String user = (String)session.getAttribute("user"); usersMap = (Map<String, HttpSession>)application.getAttribute("users"); if(null != usersMap){ if(usersMap.containsKey(user)){ if(session.getId().equals(usersMap.get(user).getId())){ usersMap.remove(user); } } } //将session设置成无效 event.getSession().invalidate(); System.out.println("一个Session被销毁了!"+user);
-
发表评论
-
java 将文件夹所有的文件合并到指定的文件夹下
2020-06-30 19:17 976场景:将文件夹所有的文件合并到指定的文件夹下 另外:如果想效 ... -
多线程-线程池的四种创建方式
2020-04-01 18:38 410多线程-线程池的四种创建方式 https://blog.cs ... -
Java基础之:nio
2019-11-13 15:38 414一、理论讲解: 史上最强Java NIO入门:担心从入门到放弃 ... -
Java 分布式之:RPC 基本概念
2019-11-13 15:07 401转载: https://www.jianshu.com/p/ ... -
Java之 volatile 关键字原理详解
2019-11-07 15:36 441一、什么是 volatile ? ... -
POI实现excell批注背景图片(仿html浮窗显示图片)
2019-10-21 08:17 600POI实现excell批注背景图片(仿html浮窗显示图片) ... -
Java之设计模式之 Observer 观察者
2019-07-04 17:21 972观察者设计模式 Java 已经实现了该模式,并且提供了使用类 ... -
HashMap, LinkedHashMap and TreeMap
2019-03-01 11:04 624https://stackoverflow.com/a/177 ... -
Java lib 操作 excel 插入图片
2019-01-19 12:46 838https://poi.apache.org/componen ... -
数据库连接池C3P0
2018-05-29 16:50 810一、名字的由来 很多 ... -
Java8之集合(Collection)遍历 forEach()、stream()
2018-05-29 14:39 20658package java8.collections; ... -
Junit Vs main on "java.util.concurrent.Executors"
2017-11-10 16:44 732Same code with different result ... -
Java之大数据学习路线
2017-11-03 10:08 5673三个月大数据研发学习 ... -
Java中创建对象的5种方式
2017-10-26 14:21 805一、Java之5种创建对象的方式 ————————————— ... -
Log4j和Slf4j的比较
2017-06-23 12:41 1360一直搞不清 Log4j 和 SLF4j 的关系。今天才若有所 ... -
Java之Java7新特性之try资源句式
2017-04-20 14:58 5338Java之Java7新特性之try资源句式 一、【try资源 ... -
Java之 java.util.concurrent 包之ExecutorService之submit () 之 Future
2017-03-04 21:27 3772一、如何使用 ExecutorService.submit() ... -
Java之 java.util.concurrent 包之Executor与ExecutorService
2017-03-04 21:18 2643一、问题: execute() 与 submit() 的区别? ... -
Java之多线程之线程池之线程重复使用
2017-02-04 13:33 5522一、问题背景 在使用多线程时,如果要开启一个任务,则就需要新 ... -
Java之语法之方法调用之地址传值之空对象(null)
2017-01-26 14:05 3232一、问题: public void test ...
相关推荐
JavaEE 拦截器用户登录案例源代码
JavaEE Spring MyBatis框架(登录)JavaEE Spring MyBatis框架(登录)JavaEE Spring MyBatis框架(登录)JavaEE Spring MyBatis框架(登录)JavaEE Spring MyBatis框架(登录)JavaEE Spring MyBatis框架(登录)JavaEE Spring ...
JavaEE MVC模式实现登录注册和用户增删改
javaEE企业级开发SSM整合实现网站后台管理后台登录与院校管理
用的是MySQL数据库,自己建立一张user表就好了,只做了三列,ID,自增长,int;username,varchar;password,varchar;其他的日期什么的自己添加就好了,不是特别难,所有对数据库的操作都在servlet中
这是一个JAVA开发的博客,基于SSH,附带文档和数据库。
JavaEE Spring Struts2 Hibernate SSH2框架(登录例子) JavaEE Spring Struts2 Hibernate SSH2框架(登录例子) JavaEE Spring Struts2 Hibernate SSH2框架(登录例子) JavaEE Spring Struts2 Hibernate SSH2框架(登录...
用户登录案例需求: 1.编写login.html登录页面 username & password 两个输入框 2.使用Druid数据库连接池技术,操作mysql,day14数据库中user表 3.使用JdbcTemplate技术封装JDBC 4.登录成功跳转到...
详细注释了用户登录注册页面,适合初学者学习和参考。
javaee简单登录和增删查改。实现个人信息的一些增删查改。和登录报错,等等。
此系统的开发改善了一些技术和增加创新,使之代替了传统的销售方式,解决了管理困难、销售成本高等问题。同时此系统具有使用简单,用户界面友好,便于操作等特点。 内含项目完整代码,数据库及配套报告。
javaee实验六 Hibernate 的体系结构——登录用户信息的增删改 查
JavaEE+hadoop大数据实战项目开发19期视频教程(百度网盘链接) 视频,文档,源代码都有!
禁止用户不通过登录页面直接进入登录成功页面;在登录成功页面显示此页面(登录成功页面)自部署...实现数据库操作,用户登录时需要与数据库中合法用户的用户名和密码(分别为你的姓名和学号)相匹配才能进入登录成功页面;
javaee用户注册登录的实验,很不错的
基于JavaEE的电子购物网站课程设计,使用struct框架,Myeclipse8.5+tomcat6.0+sql2008 1)系统管理:分三种不同权限的用户:系统管理员、顾客、商家,主要实现系统管理员对商家、顾客的管理,可以添加、删除用户。 2...
五、轻松建立并管理多站点,所有站点权限和内容独立管理,站点间实现单点登录; 五、面向未来的过渡,JEECMS v2.3.2 Final版是JEECMS面世以来发布的第一个正式版本,具有更大的灵活性和稳定性; JEECMS v2.4新版...
java 连接数据库实现用户登录功能 能运行成功,适合初学者借鉴学习。
使用验证码,增强用户体验效果,使你的网页更具有特色
是一个JavaEE项目,用servlet和JSP实现用户注册登录系统,用到了MD5加密技术,对数据进行保护。