关于Session,在Java Web开发中,为我们提供了很多方便,Session是由浏览器和服务器之间维护的。好吧,闲话不多说,下面让我们一步一步来实现它们。

(一)首先来说下Session超时时间设置的三种方式,这些相对来说比较简单:

(1)在web.xml中设置session-config

<session-config>

<session-timeout>2</session-timeout>

</session-config>

即交互间隔时间最长为2分钟(该处时间单位为分钟),2分钟后session.getAttribute()获取的值为空。

(2)在Tomcat的/conf/web.xml中session-config,默认值为:30分钟

<session-config>

<session-timeout>30</session-timeout>

</session-config>

同上,时间单位为分钟。

(3)在Servlet中设置

HttpSession session = request.getSession();

session.setMaxInactiveInterval(60);

即在你的程序代码中手动设置(该处时间单位为秒)。

优先级:Servlet中设置 >web.xml设置 > Tomcat/conf/web.xml设置

(二)同一用户强制下线

大家都知道在目前很多的web项目中,大多数情况下都是可以让同一个用户账号在不同的登录入口登录的,但这样其实就显得不是很严谨了,毕竟信息修改等操作对于信息是否能完全即时同步还是个未知之数。所以,接下来,我要做的只是对于不同浏览器的同一个用户账号的强制下线处理,对于同一个浏览器暂不做考虑,先来看下面这张图。大概的了解一下:

从上面可以看出:同一个浏览器对于不同的账号,登录时会产生相同的sessionId,这也就导致了用户之间信息的覆盖;不同浏览器对于不同的账号登录时,登录时会产生不同的sessionId,这也就给了我们可操作的空间了,正是要利用这一点来进行判断和相应处理。

(1)添加监听器

为了方便这里使用Session监控的方式,创建SessionListener,如下:

public class SessionListener implements HttpSessionBindingListener{

@Override

public void valueBound(HttpSessionBindingEvent event){

// TODO Auto-generated method stub

}

@Override

public void valueUnbound(HttpSessionBindingEvent event){

// TODO Auto-generated method stub

}

}

这里HttpSessionBindingListener和HttpSessionListener效果一样,大家可以任选其一。重载两个方法:session的创建和销毁。

当然,在web.xml中添加相应配置是必不可少的:

<listener>

<listener-class>com.yoki.util.SessionListener</listener-class>

</listener>

由于sessionId和userId需要存储,方便后面的判断,我们在上面的类中添加两个Map,如下:

//保存username和session的映射

public static HashMap<String,Session> MAP1 = new HashMap<String,Session>();

//保存sessionID和username的映射

public static HashMap MAP2 = new HashMap();

最后,用户登录验证成功时需要调用一个方法来判断是否强制下线:

public static void userLogin(Session session,String sUserName){

//已登录

if(MAP2.containsValue(sUserName)){

Session l_session = MAP1.get(sUserName);

//不同浏览器,同一用户(强制下线前一个)

if(l_session != null && l_session.getId() != session.getId()){

MAP1.remove(sUserName);

MAP2.remove(l_session.getId());

l_session.setAttribute("msg", "您的账号已在另一处登录!");

MAP2.put(session.getId(), sUserName);

MAP1.put(sUserName, session);

}

//同一浏览器,同一用户(不做任何变动)

}else{

//未登录

if(MAP2.containsKey(session.getId())){

//同一浏览器,不同用户(不做任何变动)

}else{

//不同浏览器,不同用户(正常添加)

MAP2.put(session.getId(), sUserName);

MAP1.put(sUserName, session);

}

}

}

解释一下:这里使用username和userId效果一样,看你们怎么方便怎么用了,方法中的逻辑是根据上面的图来编写的,首先判断用户是否登录了,因为MAP中保存了相关的session关联信息,所以可以通过这个来判断;由于此处只对不同浏览器相同用户进行处理,所以直接判断是否是同一个浏览器。方法的参数session是用户在当前浏览器登录时的信息,我们可以从MAP中得到之前保存过的相同用户的session信息,与之进行比较,里面的逻辑是:移除MAP中保存的之前的用户信息(对应的session此时未销毁),并给其session添加一个msg信息(后面用到,往下看),再添加新的用户信息。

上面的方法调用放在登录验证成功后,各自项目不同,但登录验证的类基本差不多:

SessionListener.userLogin(session, USERNAME);

(2)添加前端页面调用的方法

在登录验证的类中添加如下方法:

/*

* 判断用户是否重复登录

*/

@RequestMapping(value="/checkUserOnline")

@ResponseBody

public void checkUserOnline(HttpServletRequest request,HttpServletResponse response) throws IOException{

HttpSession session=request.getSession();

PrintWriter out = response.getWriter();

String msg = "";

if(session.getAttribute("msg") != null){

msg = session.getAttribute("msg").toString();

System.out.println(msg);

}

out.print(session.getAttribute("msg"));

}

方法中获取之前添加到session中的msg,用来判断是否强制下线,继续。

(3)前端页面循环调用

选择一个页面,最好是所有页面都用到的,比如我用的index.jsp,如下:

<script type="text/javascript">

$(document).ready(function(){

setInterval("checkUserOnline()",5000); //每隔5秒判断一次

}

function checkUserOnline(){

var msg = "";

$.ajax({

type : "POST",

url : "checkUserOnline",

data : {},

async: false,

success : function(data){

msg = data;

}

});

if (msg == 'null' || msg == '' || msg == 'undefined'){

return;

}else{

//调用你的注销用户方法

var url="<%=path%>/logout.do";

$.get(url,function(data){});

}

}

</script>

js中调用setInterval方法,设置调用的方法和间隔时间,方法里通过ajax调用上面添加的类并返回msg,通过msg来判断是否调用注销方法(路径啥的自己注意,能调用到就ok)。

(4)注销

一般web项目登录进去后都会有个退出按钮,点击即返回到登录页,此时在里面添加一行代码,防止错误,可能会出现重新登录报session已被销毁的错误提示,但第二次便会成功,这里便是为了消除该错误:

SessionListener.MAP2.remove(session.getId());

好了,基本的设置完成了,启动项目,打开两个不同的浏览器,先登录一个用户,成功后,在另一个浏览器中登录相同的用户,登录成功后,会在控制台上打印出msg:

您的账号已在另一处登录!

此时,刷新第一个浏览器用户登录界面,便会发现已经退出跳转到登录页了,大功告成!!!

java强制下线 session_Session管理之超时设置和强制下线相关推荐

  1. html强制不换行标签,css如何设置文字强制不换行?

    css可以使用white-space属性设置文字强制不换行,通常我们使用white-space:nowrap强制文本文字内容不换行,在对象内一行显示完所有文字内容. css可以使用white-spac ...

  2. java web tcp长连接超时时间_常用java web容器http长连接超时设置

    1.http长连接相关知识 http长连接对我们来说并不陌生,但长连接并不是永远不会关闭.对于HTTP长连接需要注意下面几点:keepalive_timeout指的是web服务器发送完最后一个响应报文 ...

  3. java 设置超时_java线程超时设置方法

    对于java中线程超时间可以使用ExecutorService与Timer来控制一个线程什么时候超时了,下面我整理了一些方法,这些文章都详细的介绍java线程超时设置技巧. 方法一 本例子使用Exec ...

  4. java selenium一一等待超时设置

    java selenium一一超时设置 前言 1.显式等待 2.隐式等待 3.流利等待 前言 在使用selenium中我们遇到了,有时候一个点击查询或者其它操作需要加载等待很长的时间,我的程序就会等待 ...

  5. java setsotimeout_HttpClient超时设置setConnectionTimeout和setSoTimeout

    http是基于TCP/IP进行通信的,tcp通过3次握手建立连接,并最终以4次挥手终止通信. 知乎上对三次握手和四次挥手有如下解释: 作者:知乎用户 链接:https://www.zhihu.com/ ...

  6. 深入理解JDBC的超时设置 转

    转 http://www.admin10000.com/document/1360.html 恰当的JDBC超时设置能够有效地减少服务失效的时间.本文将对数据库的各种超时设置及其设置方法做介绍. 真实 ...

  7. java 内存管理_高性能Java代码之内存管理

    本文通过几个方面,来介绍Java代码的内存管理. 有的代码,GC根本就回收不了,直接系统挂掉.GC是一段程序,不是智能,他只回收他认为的垃圾,而不是回收你认为的垃圾. GC垃圾回收: Grabage ...

  8. java jvm内存模型_Java(JVM)内存模型– Java中的内存管理

    java jvm内存模型 Understanding JVM Memory Model, Java Memory Management are very important if you want t ...

  9. Java中的会话管理– HttpServlet,Cookie,URL重写

    Session Management in Java Servlet Web Applications is a very interesting topic. Session in Java Ser ...

最新文章

  1. pytorch nn.Embedding
  2. android webview单向认证,android 让webview支持自签名证书https 双向认证(SSL)
  3. iMeta期刊投审稿系统ScholarOne正式上线
  4. POJ - 1698 Alice's Chance(二分图多重匹配-网络流)
  5. SAP CRM fiori application delete if only one note header
  6. ViewRoot,DecorView,MeasureSpec和View的工作原理——Android开发艺术探索笔记
  7. JS中的prototype、__proto__与constructor,原型和原型链
  8. C#代码规范化(代码风格化)的几个函数
  9. vue路由匹配实现包容性_成为多元化和包容性领导者的3个关键策略
  10. 【Elasticsearch】es查看有问题的索引或者分片
  11. WCF Ria Service“操作失败,指定的命名链接在配置中找不到”错误解决方法
  12. springboot毕设项目流浪动物救助和领养平台e1yqy(java+VUE+Mybatis+Maven+Mysql)
  13. 计算机网络技术基础竞赛题,网络技术基础知识竞赛试题
  14. mysql mtq_mysql实现远程登录
  15. Arduino使用ESP8266安装问题(包括附加开发板管理网址)
  16. 服务器日志法网站分析的原理及优缺点
  17. oracle library is not loaded解决方法
  18. 常见音频文件格式的特点。
  19. 计算机专业英语四个部分思维导图,一张思维导图,彻底分清英语五大基本句型...
  20. ZYNQ裸板:DDR篇

热门文章

  1. 送从兄郜 / 韦郜 / 途中别孙璐 出自唐代方干
  2. tomcat启动报错问题解决
  3. 钉钉Mac版创建群及添加机器人
  4. html逐渐显示图片,怎么用jquery让图片逐渐显示出来
  5. Python-Tkinter图形化界面设计
  6. 基本图算法时间复杂度
  7. 公开密钥密码学是什么
  8. handlebar.js模板使用方法简记
  9. 详细学习Python的格式化输出
  10. python作用域,变量作用域