这里会话管理暂时学到的只有4种
- 隐藏域
- Cookie
- url重写
- httpsession
会话管理的概念:
- 背景:HTTP协议中,服务器无记忆,每次请求都是新的请求,是一种无状态通信协议,但是有些需求要求能记得前后请求之间的关系,比如用户在多个网页之间采购商品、网络笔试等;
- 会话管理:管理多次请求之间关系的技术,要求保存前后请求响应的一些中间结果;
- httpSession是功能最全的。
隐藏域
1) 隐藏域是HTML的一种input表单,其属性type为”hidden”,其余属性和普通的input相同,有参数名和参数值,例如:;
2) 隐藏域回合其它参数一样被提交给服务器,比如上面的那个例子就是?var=123,但和其它参数不同的是隐藏域不会显示在HTML页面中,而其它参数会以各种形式予以显示,比如按钮、列表等等,因此叫做隐藏域;
3) 使用隐藏域进行会话管理的思想是:
i. 在Servlet中将上一次请求的响应结果用Response写成隐藏域返回给浏览器;
ii. 那么上一次响应结果会以隐藏域的形式隐藏在响应页面中;
iii. 然后用户操作完响应页面再提交,那么上一次的结果就会通过隐藏域的形式上传给服务器,那么这样服务器就能再次获得上一次请求的响应结果了!
Cookie
1) Cookie是浏览器存储服务器发来的信息的一种方式,服务器发给浏览器的信息可以以Cookie为单位存储在浏览器中,等到下次请求时可以把保存的Cookie再发送给服务器进行处理;
2) Cookie的格式和标头:
i. 一个cookie表示一个键值对,即参数和参数值(都是字符串);
ii. 在服务器和浏览器之间传送Cookie时将cookie保存在set-cookie标头内(请求标头和响应标头),例如:
set-cookie:user=Peter;number=12345 // 这里就表示传送了两个cookie,一个是user=Peter,另一个是number=12345,多个cookie都写在一个set-cookie标头下
3) Cookie的保存方式:Cookie将以文件的形式保存在浏览器所在的计算机上,等到下次请求同样的网站时会将该网页所属域的所有Cookie都发送给服务器;
4) Servlet创建与获取Cookie的API:
i. 创建、设置生命周期、添加Cookie:
a. 创建:Cookie(String name, String value); // 键值对为参数
b. 设置生命周期:void Cookie.setMaxAge(int expiry); // 设置本Cookie最多在浏览器端存活几秒,超时就会清除
c. 添加:void HttpServletResponse.addCookie(Cookie cookie); // 将一个Cookie添加到set-cookie响应标头中,可以添加多个,第一次添加意味着会在标头中加入set-cookie标头
!!既然Cookie是通过标头传送的,因此添加Cookie必须要在响应确认之前添加,否则无效;
ii. 获取浏览器发送来的Cookie:
a. 获取:Cookie[] HttpServletRequest.getCookies(); // 返回请求标头中所有的Cookie
b. 对Cookie进行解析,获取参数名:String Cookie.getName();
c. 获取参数值:String Cookie.getValue();
URL重写
1) 就是Servlet直接响应几条<a>
超链接给浏览器,超链接里面有URL,而Servlet就将上一次响应结果保存在超链接URL的请求参数中,用户点击超链接后就会通过将上次响应结果通过超链接的请求参数再发送给Servlet,这样就能记住上次访问的信息了;
2) 由于<a>
超链接只能以GET方法请求,因此URL重写就是一种GET请求参数的应用;
3) URL重写的应用场合:
i. 由于URL重写是使用HTML超链接的技术,而超链接必须以GET方式请求;
ii. GET的请求参数长度有限,因此URL重写只能保存信息量很少的中间结果,不适用于大量数据的保存;
iii. URL重写还可以辅助HttpSession会话管理;