(第四章)会话管理

第四章会话管理

目录

第四章会话管理

1、会话管理基本原理

1.1使用隐藏域

1.2使用Cookie

1.3使用URL重写

2、HttpSession会话管理

2.1使用HttpSession

2.2HttpSession会话管理

2.3HttpSession与URL重写


1、会话管理基本原理

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

1.1使用隐藏域

在HTTP协议中,服务器时没有记忆功能的,对每次请求都一视同仁,根据请求中的信息来运行程序并响应,每个请求对服务器来说都是新请求。

隐藏域就是主动告知服务器多次请求间必要信息的方式之一。以问卷作答的为例,上一页的问卷答案,可以用隐藏域的方式放在下一页的窗体中,这样发送下一页窗体时,就可以一并发送这些隐藏域,每一页的问卷答案就可以保留下来。

使用隐藏域的方式,在关掉网页后,显然会遗失先前的请求信息,所以仅适用于一些简单的状态管理,如在线问答。由于在查看网页源代码时,就可以看到隐藏域的值,因此这个方法不适合用于隐藏性较高的数据。

1.2使用Cookie

Web应用程序会话管理的基本方式,就是在此次请求中,将下一次请求时服务器应知道的信息,先响应给浏览器,由浏览器在之后的请求再一并发送给应用程序,这样应用程序就可以“得知”多次请求的相关数据。

Cookie是在浏览器存储信息的一种方式,服务器可以响应浏览器set-cookie标头,浏览器收到这个标头与数值后,会将它以文件的形式存储在计算机上,这个文件就称之为Cookie

Servlet本身提供了创建、设置与读取Cookie的API。如果你要创建Cookie,可以使用Cookie类,创建时指定Cookie中的名称与数值,并使用HttpServletResponse的addCookie()方法在响应中新增Cookie。

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

Cookie另一个常见的应用,就是实现用于自动登录(Login)功能。

1.3使用URL重写

所谓URL重写,其实就是GET请求参数的应用,当服务器响应浏览器上一次请求时,将某些相关信息以超链接方式响应给浏览器,超链接中包括请求参数信息。

2、HttpSession会话管理

2.1使用HttpSession

在Servlet/JSP中,如果想要进行会话管理,可以使用HttpServletRequest的getSession()方法取得HttpSession对象。HttpSession session = request.getSession();

HttpSession上最常使用的方法大概就是setAttribute()与getAttribute(),可以让你在对象中设置及取得属性。如果想在浏览器与Web应用程序的会话期间,保留请求之间的相关信息,可以使用HttpSession的setAttribute()方法将相关信息设置为属性。在会话期间,你就可以当作Web应用程序“记得”客户端信息,如果想取出这些信息,则通过HttpSession的getAttribute()就可以取出。

默认在关闭浏览器之前,取得HttpSession都是相同的实例。如果想在此次会话期间,直接让之前的HttpSession失效,可以执行HttpSession的invalidate()。一个使用的时机就是实现注销机制。

2.2HttpSession会话管理

使用HttpSession进行会话管理十分方便,让Web应用程序看似“记得”浏览器发出的请求,连接数个请求间的关系。但无论如何,Web应用程序基于HTTP协议的事实并没有改变,实际上如何“得知”数个请求之间的关系,这件工作是由Web容器帮你执行。尝试运行HttpServletRequest的getSession()时,Web容器会创建HttpSession对象,关键在于每个HttpSession对象都会有个特殊的ID,称为SessionID,你可以执行HttpSession的getID()来取得SessionID。这个SessionID默认会使用Cookie存放在浏览器中。在Tomcat中,Cookie的名称是JSESSIONID,数值是getId()所取得的SessionID。

由于Web容器本身是执行于JVM中的一个Java程序,通过getSession()取得HttpSession,是Web容器中的一个Java对象,HttpSession中存放的属性,自然也就存放于服务器端的Web容器之中。每个HttpSession各有特殊的SessionID,当浏览器请求应用程序时,会将Cookie中存放的SessionID一并发送给应用程序,Web容器会根据SessionID来找出对应的HttpSession对象,这样就可以取得各浏览器个别的会话数据。

所以使用HttpSession来进行会话管理时,设定属性的对象是存储在服务器端,而SessionID默认使用Cookie存放于浏览器端。Web容器存储SessionID的Cookie“默认”为关闭浏览器就失效,所以重新启动浏览器请求应用程序时,通过getSession()取得的是新的HttpSession对象。

每次请求来到应用程序时,容器会根据发送过来的SessionID取得对应的HttpSession。由于HttpSession对象会占用内存空间,所以HttpSession的属性中尽量不要存储耗资源的大型对象,必要时将属性移除,或者不需要使用HttpSession时,执行invalidate()让HttpSession失效。

2.3HttpSession与URL重写

如果用户关掉浏览器接受Cookie的功能,就无法使用Cookie在浏览器存储SessionID。如果在用户禁用Cookie的情况下,仍打算运用HttpSession来进行会话管理,那么可以搭配URL重写的,向浏览器响应一段超链接,超链接URL后附加SessionID,当用户单击超链接,将SessionID以GET请求发送给WEB应用程序。

如果要使用URL重写的方式发送SessionID,可以使用HttpServletResponse的encodeURL()协助产生所需的URL重写。当容器尝试取得HttpSession实例时,若能从HTTP请求中取得带有SessionID的Cookie,encodeURL()会将传入的URL原封不动的输出。如果容器尝试HttpSession实例时,无法从HTTP请求中取得带有SessionID的Cookie时,encodeURL()会自动产生带有SessionID的URL重写。

发布了17 篇原创文章 · 获赞 0 · 访问量 218

猜你喜欢

转载自blog.csdn.net/SUN19980421/article/details/104349755
今日推荐