• java程序开发过程中会话管理的技巧


    有效安全用户的会话状态对Web应用程序来说至关重要。如淘宝的网上交易系统。因为在同一时间可能有数以千计的用户在使用这个系统。为此服务器必须要知道当用户在浏览不同网页查询并选购商品时,哪些商品是属于哪个消费者的。再如有时候为了安全考虑,不能够让一个会话空闲太久。如现在网上银行或者Email系统,当用户走开一段时间(即如果有时分钟没有任何操作的话),则系统为了安全起见,为自动断开用户当前会话。当用户需要再次使用系统的话,则就要重新登陆。这些人物就都是有会话状态来完成的。

      一般来说,一个会话就代表一个用户的Web操作进程。Web程序为了掌握客户使用情况,可以通过浏览器的机制(如Cookies)将一个用户浏览的一系列网页标识为属于同一个会话。会话实际上是通过浏览器和Web服务器的协议来实现的。具体会话管理的方法可能比较多,笔者这里以Request接口为例,谈谈应用程序开发过程中会话管理的技巧。

      一、cookie与URL重写管理方法的缺陷。

      在传统的Web应用程序管理中,通常是通过cookie或者URL重写来维护相关的数据。Cookie是指Web服务器向客户端发送并在客户端保存的一个小型数据文件。文件中包含服务器的名称、时间等信息。当用户向Web服务器发送访问请求的时候,它就把以前Web服务器发送的cookie数据随请求发送到Web服务器。如此的话,Web服务器收到请求之后就可以知道当前请求是属于哪个会话。URL重写式在标明Web请求地址的URL中加入会话标识,如在网址后面加上会话ID来实现。那么浏览器和Web服务器之间就可以沟通会话信息。这两种方式确实能够起到有效管理会话的效果。

      但是现在很多的商业网站,如淘宝、网上银行等等,都不再使用这种方式。这是为什么呢?主要是因为这两种管理方式由比较大的安全隐患。因为他们在保存数据时都没有采取加密的措施。如用户名与密码等机密信息在cookie中都是通过明文保存的,很容易被人窃取并利用。为此一个有比较高的安全需求的Web服务器来说,必须要寻找其他的解决方式。

      二、HttpSession的获取与管理。

      在J2EE开发平台中,主要通过HttpSession接口来管理与追踪会话信息,或者说,这个接口其就代表了Web程序的会话。具体的来说,其主要完成两项任务。第一项任务是开发人员可以通过这个接口来查看会话的相关信息,包括会话的代号、创建的时间、最后使用的时间等等。如当用户空闲一段时间后自动断开会话就需要用到这里的最后使用时间信息。

      第二项任务是建立数据对象和会话之间的关联,从而使用户信息能够在多个用户请求之间共享。如淘宝网,当用户将某个商品加入到购物车之后,仍然可以浏览其他网页,最后再来处理购物车中的内容。当用户提出其他请求后,购物车中的内容服务器仍然会保存。这就需要用到这项功能。

      这里需要注意一个问题,如果用户决定不加入请求(如人为手工关闭浏览器的Cookie并且Web程序不使用URL重写的话,用户的每次请求,Web容器都需要建立一个新的会话。这就是为什么用户在访问某些网站时,浏览器提醒用户打开Cookie等功能的原因。因为没有cookie或者URL的支持,某些功能就无法使用。

      三、在HttpSession中主要调用的两种方法。

      HttpSession接口与其他接口类似,都是通过方法来实现对其的调用。一般来说,主要用到如下两类方法。

      第一类是查询与设置会话属性的方法。如开发人员需要将某个特定的对象(如购物车)与某个会话关联起来的话,就需要使用setAttribute方法。这个方法可以将一个对象以特定的名称和会话关联起来。如果要消除他们之间的关联的话,则需要使用removeAttribute方法。不过一般情况下,不需要手工清除,而是有系统自动维护,除非出于测试的需要。如果想知道这个会话的相关属性,则需要使用getAttribute方法。通过这个方法可以了解到会话ID、服务器名字等有用的信息。

      第二类是很会话生命周期相关的方法。如服务器需要知道用户会话的建立时间和最后一次请求时间,就需要用到getCreation Time方法和getLastAccessedTime方法。这两个方法将会返回某个特定会话的创建时间和在某个特定会话内Web容器接收到客户最后一次发出请求的时间。像网上银行,当用户超过某个特定的时间没有进行访问自动断开会话,这个时间该如何设置呢?这主要用到了一个getManInactiveInterval方法。这个方法设定允许客户请求之间的最长间隔时间。不过同时要结合使用invaildate方法。如果没使用这个方法的话,系统并不会使第一个会话失效,而是将其当作两个不同的会话。反之,则会使原先的会话失效,同时删除其属性对象。对于用户来说,就是需要重新登陆。

    四、管理会话的生命周期。

      从上面的分析中可以得知在HttpSession接口中提供了很多跟生命周期相关的方法,也这也是用户会话中管理的重难点。在实际工作中,开发人员主要关注的是会话失效的时间。即当符合某个特定的条件,用户的有没有自动失效。这不仅跟安全有关(如果用户的会话没有被正常关闭,则很有可能会其他人冒用,损害用户的利益),而且还跟服务器的性能息息相关(当用户关闭浏览器终止会话,而实际上客户端与服务器端的会话仍然没有终止,这些无效会话会占用服务器的资源)。

      在这里笔者要强调一下,通常情况下有三种情况会导致客户端与服务器端之间的会话失去效力。一是当用户关闭浏览器的时候,如用户网上银行用完后关闭浏览器窗口。注意及时没有按窗口中的退出按钮,直接关闭浏览器,然后再重新打开,服务器仍然会认为这是一个新的会话,需要重新登陆。笔者认为这个设计还是比较合理的。因为在同一台机器上不同时间打开的浏览器其用户不一定是相同的。特别是在网吧等公共场合,这种机制可以大大提高用户请求的安全性。

      二是当某个会话超过了最长的有效期限之后。如现在不少的邮件系统或者网上银行,都会设置一个最长的有效期限。当用户在这个时间间隔内,没有做出任何的响应,系统就会自动中断当前会话。用户需要再次访问时,就可能需要重新登陆了。这主要是出于安全的考虑。

      三是程序开发人员直接使用invalidate方法将某个会话失效,并删除所有与这个会话相关的属性。这种方式在应用程序中也比较多见。如用户通过网上直销机构购买基金时,在Web窗口中一般都会有一个“安全退出”的按钮。在这个按钮中就采用了这个invaildate方法。当用户点击这个按钮的时候,浏览器会向Web服务器发出请求,使当前会话失效,同时删除与之关联的所有属性与对象。

      在实际工作中,往往会有专门人员负责会话的追踪与管理,其他开发人员必须要配合。而不能够自己另搞一套。作为一个应用程序开发的项目管理人员,要切实做好他们之间的协调。否则的话,会话一乱,会给用户带来很大的困扰。另外需要注意一点的是,当浏览器异常关闭,如客户端突然断电或者通过任务管理工具强制关闭浏览器时,会话也需要随之关闭。

  • 相关阅读:
    es6字符串扩展(+模板字符串拼接)
    MySQL-技术专区-mysql数据库权限管理
    MySQL-技术专区-数据库权限管理
    开源软件的盈利模式
    分布式-技术专区-Redis分布式锁实现-第二步
    分布式-技术专区-Redis分布式锁实现-第一步
    分布式-技术专区-Redis分布式锁原理实现
    JPA接口整理归纳方法规则
    备份整理-实用归纳
    Zookeeper-技术专区-运作流程分析介绍
  • 原文地址:https://www.cnblogs.com/luhaiyan/p/2046611.html
Copyright © 2020-2023  润新知