servlet中的会话管理

Web应用程序的请求与响应是基于HTTP,为无状态的通信协议,服务器不会"记得"这次请求与下一次的请求之间的关系.然而有些功能是必须由多次请求来完成,例如当用户在多个网页之间采购物品时,WEB应用程序必须有个方式来"得知"用户在这些网页采购了哪些商品,这种记得此次请求与之后请求间关系的方式称为会话管理.

          实现会话管理有几个基本方式.如隐藏域,Cookie与URL重写.

      1.  隐藏域:就是主动告知服务器多次请求间必要信息的方式之一.以问卷作答为例,上一页的问卷答案发送至服务器,由服务器可以用隐藏域的方式放在下一页的窗体中再响应给浏览器,这样在发送下一页窗体时,就可以一并发送这些隐藏域,从而让每一页的答案保存下来.但是使用隐藏域的方式,在关闭网页后,会遗失先前的请求信息,所以仅适用于一些简单的状态管理.并且在查看网页源代码时,就可以看到隐藏域的值,因此这个方法也不适合用于隐秘性较高的数据.隐藏域不是servlet/jsp实际管理会话时的机制,介绍它只是为了说明,由浏览器主动告知必要的信息,为实现WEB应用程序会话管理的基本原理.

       2. Cookie:是在浏览器存储信息的一种方式,服务器可以响应浏览器set-cookie标头,浏览器收到这个标头与数值后,会将它以文件的形式存储在计算机上,这个文件就称为Cookie.可以设定给cookie一个存活期限,保留一些有用的信息在客户端,如果关闭浏览器之后,再次打开浏览器并连接服务器时,这些cookie仍在有效期限中,浏览器会使用cookie标头自动将cookie发送给服务器,服务器就可以得到一些先前浏览器请求的相关信息.如果你姚创建cookie,可以使用cookie类,创建时指定cookie中的名称与数值,并使用HttpServletResponse的addCookie()方法在响应中新增Cookie.

例如:

          Cookie cookie = new Cookie("user","caterpillar");

          cookie.setMaxAge(7 * 24 * 60 * 60);               //设定Cookie的有效期限,单位为秒,默认关闭浏览器之后失效

          response.addCookie(cookie);

        这里要注意的是HTTP中Cookie的设定是通过set-cookie标头,所以必须在实际响应浏览器之前使用addCookie()来新增Cookie实例,在浏览器输出HTML响应之后在运行addCookie()是没有作用的.

        如果要取得浏览器上存储的cookie,则可以从HttpServletRequest的getCookies()来取得,这可取得属于该网页所属域的所有cookie,所以返回值是Cookie[]数组.取得Cookie对象后,可以使用cookie的getName()与getValue()方法,分别取得Cookie对象的名称和数值.

      3.   使用URL重写:  其实就是GET请求参数的应用,当服务器响应浏览器的上一次请求时,将某些相关信息以超链接方式响应给浏览器超链接中包括请求参数信息.URL重写是在超链接之后附加信息的方式所以必须以GET方式发送请求,再加上GET本身可以携带的请求参数长度有限,因此大量的客户端信息保留,并不适合使用URL重写.

会话管理机制:HttpSession

                           HttpSession session = request.getSession();          //获得HttpSession对象

                           setAttribute()                                             //设置属性,保存请求之间的相关信息

                           getAttribute()                                            // 取得属性

                           invalidate()                                                //使HttpSession对象失效

                           setMaxInactiveInterval()                         //设定的是HttpSession对象在浏览器多                                                                                               久没活动就失效的时间,而不是存储                                                                                                  Session ID的Cookie失效的时间.

       HttpSession会话管理原理:    当尝试运行HttpServletRequest的getSession()时,web容器会创建HttpSession对象,关键在于每个HttpSession对象都会有个特殊的id,称为Session ID,你可以执行getId()方法来获得.这个Session ID默认会使用Cookie存放在浏览器中,在Tomcat中,Cookie的名称是JSESSIONID,数值则是getId()所取得的Session ID.每一个HttpSession各有其特殊的Session ID,当浏览器请求应用程序时,会将Cookie中存放的Session ID一并发送给应用程序,web容器会根据Session ID来找出对应的HttpSession对象,这样就可以取得各浏览器个别的会话数据.所以使用HttpSession来进行会话管理时,设定为属性的对象存储在服务器端的,而Session ID默认使用Cookie存放在客户端,WEB容器存储Session ID的cookie默认为关闭浏览器失效,所以重新启动浏览器请求应用程序时,通过getSession()取得的是新的HttpSession对象.而且HttpSession对象会占用内存空间,所以HttpSession的属性中尽量不要存储耗资源的大型对象,必要时将属性移除,或者不使用HttpSession时,执行invalidate()让HttpSession对象失效.如果在用户禁用Cookie的情况下仍打算运行HttpSession进行会话管理,那麼可以搭配URL重写,当使用URL重写的方式来发送Session ID,可以使用HttpServletResponse的encodeURL()协助产生所需的URL重写.当容器尝试取得HttpSession实例时,若能从HTTP请求中取得带有Session ID的cookie,encodeURL()会将传入达的URL原封不动的输出.若不能取得,该方法会自动产生带有Session ID的URL重写.


你可能感兴趣的:(javaweb)