2019独角兽企业重金招聘Python工程师标准>>>

关于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{@Overridepublic void valueBound(HttpSessionBindingEvent event){// TODO Auto-generated method stub}@Overridepublic 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:

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

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

转载于:https://my.oschina.net/u/3747963/blog/1787633

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

  1. java强制下线 session_Session管理之超时设置和强制下线

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

  2. TongWeb的session超时设置以及不依赖于TongWeb session的场景

    TongWeb 的 session 超时设置按优先级从高到低依次为: 方式一: 在应用代码中设置 session 超时时间 session.setMaxInactiveInterval(60);//单 ...

  3. session存在哪里?如何实现以及session超时设置

    sessionid是一个会话的key,浏览器第一次访问服务器会在服务器端生成一个session,有一个sessionid和它对应.tomcat生成的sessionid叫做jsessionid. ses ...

  4. php session 超时设置,php如何使用session 超时设置?

    php使用session 超时设置的方法:1.设置[php.ini]配置文件,用[ini_set]函数改变当前上下文环境的属性值:2.设置Session时间戳,代码为[unset($_SESSION[ ...

  5. java强制下线 session,登录的多地挤下线功能 redis session

    使用redis储存session 使用redis 存储 信息 和本地session 做比较 如果相同 表明是同一次登录 如果和redis不同 表明不是同一次登录 强制下线即可 req.headers. ...

  6. 20_clickhouse,硬件管理与优化(cpu,内存,网络,存储,操作系统配置),profile管理,Quotas设置,约束管理,查询权限,用户管理配置等

    26.运维管理与优化 26.1.硬件管理与优化 26.1.1.CPU 26.1.2.内存 26.1.3.网络 26.1.4.存储 26.2.操作系统的配置 26.2.1.CPU频率调整策略 26.2. ...

  7. 6.Spring Security Session 管理

    用户登录成功后,信息保存在服务器Session中,这节学习下如何管理这些Session.这节将在Spring Security短信验证码登录的基础上继续扩展. Session超时设置 Session超 ...

  8. Tomcat7.0源码分析——Session管理分析(上)

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/beliefer/article/details/52450268 前言 对于广大java开发者而言, ...

  9. 广播的最佳实践——实现强制下线功能(Android_Broadcast)...

    关键词:Broadcast, 生命周期,继承 本项目基本思路: 1.先创建一个ActivityCollector类用于管理所有的活动: 2.然后创建一个BaseActivity类作为所有活动的父类: ...

  10. tomcat架构分析 (Session管理)【转】

    原文地址:https://www.iteye.com/blog/gearever-1546423 Session管理是JavaEE容器比较重要的一部分,在app中也经常会用到.在开发app时,我们只是 ...

最新文章

  1. 2011.5.21信息系统项目管理师考试案例关注点
  2. 【IT资讯】TIOBE - 2020年6月编程语言排行
  3. JDK 14的新特性:文本块Text Blocks
  4. 用python计算列表元素之和_python实现计算列表元素之和
  5. LintCode-244.删除字符
  6. 【idea】idea快捷键(更新中....)
  7. 让我小猪佩奇教你如何进行潇洒装逼
  8. Springboot devtools热部署Mybatis报错:Could not load [mapper/]
  9. CSDN博客下载器 CSDNBlogDownloader
  10. 计算机组成原理与接口技术笔记
  11. OpenCASCADE7.6编译
  12. 在JavaScript中改变鼠标指针样式的方法
  13. 怎样给图片降噪?这几个图片降噪软件可以帮助你
  14. P1757 通天之分组背包题解
  15. java实现条形图_java – 使用Apache POI在Excel中创建条形图
  16. [Angular实战网易云]——15、歌词渲染
  17. android指南针校准 代码_Android指南针app的实现原理总结
  18. 剑指Offer_入门_JZZ_斐波那契数列
  19. JIURL键盘驱动 3
  20. 聊聊ringbuffer

热门文章

  1. 小巧单据打印管理软件
  2. 封装程序报错Failed to execute script pyi_rth_multiprocessing解决办法
  3. 景观设计建模中最常用的SU插件有哪些?
  4. Xamarin 跨平台应用开发(4)—— 页面布局
  5. 不用写代码也能学会采集海量企业电话及邮箱数据
  6. 【控制】动力学建模举例 --> 牛顿-欧拉法
  7. 下载Bootstrap
  8. SQL中常用日期函数
  9. 三维空间中无人机路径规划的改进型蝙蝠算法
  10. 【树莓派C语言开发】实验13:雨滴传感器模块(关联PCF8591)