首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java web 中的 session 操作

今天在工作中遇到了这样一个问题,在不使用权限控制框架的情况下,实现单点登录的功能,为什么不用框架呢?这是因为本人还属于小菜鸟,之前的项目没有使用,并且因为时间比较赶,没法做整体迁移的工作,So,只能赶鸭子上架,自己实现,这样改动才能更小。下面讲讲思路吧。

这个功能听起来还是挺简单的有木有,只要给用户一个登录状态的字段,登录了就将它改变,退出登录再改回去。我也是这样的一个思路,那么动起手来。

登录登出很好做,只要在用户登录的时候多判断一下登录状态是否为登录,未登录时将用户信息添加到 session 中,这里使用 request.setAttribute("标识", 用户信息); ,登出的话,使用 session.invalidate(); 将当前 session 进行销毁处理,跳转回登录页,一切看起来很完美有木有。撒花撒花

sdfdfgdf

你以为到这里就完事了吗?太天真了,有没有考虑过用户关闭浏览器的情况的呢?或者是用户打开浏览器后,很长时间没有进行操作,然后登录超时了,此时,我们好像失去了修改用户登录状态的权利,此时的用户是一直登录的状态了,要想再登录,只能修改数据库字段,这似乎很不合理不是吗?

那么,有么有解决方案呢?答案当然是有啦。

在解答这个问题前,需要先了解什么是 session:

Session: 在计算机中,尤其是在网络应用中,称为“会话控制”。Session 对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。

引用自百度百科,其实不引用,大家也会脱口而出是会话状态,那么用户登录的过程中,session 是怎么产生和传递的呢?

首先呢,只要用户访问服务器,那么,服务端就会产生一个 sessionId,用来标识这个唯一的用户,并且通过 sessionId 可以查询到当前用户存储的信息,也就是 session,这个 sessionId 在客户端的每次请求中都会携带,这也就达到了标识这个用户的目的,当用户进行登录时,会将用户的信息存储在 sessionId 对应的 session 中,也就是说,只要有请求,就一定有 sessonId;但是,服务器的资源有限,当某些用户很久没有任何操作时,存储这些 session 是在浪费资源,因此,服务器一般有个 session 超时时间。

了解了上面的知识,也就知道了 session 是容器提供的一种用户标识,并不需要我们的程序去做处理,我们只需要根据 session 做操作就好了,那么就需要知道 session 的状态,这里,它有两种状态:sessionCreated 和 sessionDestroyed,我们如何使用呢?

一、在 web.xml 中配置 session 监听器

这里是超时时间,单位分钟

这里是处理的类

二、配置处理 session 状态的类

它需要继承自 HttpSessionListener,要实现的两个方法就是上面提到的 sessionCreated 和 sessionDestroyed。

@Override

public void sessionCreated(HttpSessionEvent arg0) {

// TODO Auto-generated method stub

}

@Override

public void sessionDestroyed(HttpSessionEvent arg0) {

// TODO Auto-generated method stub

}

通过 HttpSessionEvent 我们可以得到对应的 session,这里我们重点需要的就是 sessionDestroyed,通过它,我们可以在 session 超时前进行相关业务的处理操作,也就完美解决的解决里前面的问题。

另外还需要考虑用户未退出的情况下关闭了浏览器,这会导致短时间内用户无法再次登录,这里需要用到 JavaScript 脚本进行处理了,这里就贴出一个链接供大家学习,继续讲解下去篇幅有点长了。

喜欢一个人怎么会是这样,前一秒钟你恨不得撕碎了他,下一秒却蹲在地上边哭边捡,不知道该怎么拼起来。 ——八月长安

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180428G1W8EO00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券