会话(cookie的使用,路径和Session的工作原理,使用)
1.状态管理----Cookie
1.1 为什么需要状态管理
HTTP协议是无状态的,不能保存每次提交的信息,即当服务器返回与请求相对应的应答之后,这次事务的所有信息就丢掉了。
如果用户发来一个新的请求,服务器无法知道它是否与上次的请求有联系。
对于那些需要多次提交数据才能完成的Web操作,比如登录来说,就成问题了。
1.1.1 什么是状态管理(会话管理)
指的是一个客户端的浏览器到WEB服务器之间连续发生的一系列请求和响应的过程。
(相当于打电话)从打开浏览器访问某个网站到关闭该网站的过程我们称为一次会话。
1.1.2状态管理的两种常见的模式;
客户端状态管理技术:将状态存放在客户端。代表性的是Cookie技术(浏览器)
服务器状态管理技术:将状态存放在服务器中。代表的是Session.
1.2.Cookie应用
1.2.1什么是Cookie
Cookie的创建是由服务器创建,服务端调用相关的方法将Cookie响应给客户端
一个Cookie只能标识一种信息,它至少含有一个标识该信息的名称(name)和设置值(value)。
说明:Cookie 是由键值对方式存储数据 name:jack
一个WEB站可以给一个WEB浏览器发送多个Cookie,一个WEB浏览器也可以存储多个WEB站点
提供的Cookie。
1.2.2Cookie的使用
步骤:
1.创建Cookie
Cookie cookie=new Cookie(“name”,“jack");//键值对
2.设置Cookie的路径
cookie.setPath("/")
3.设置Cookie的生存时间
cookie.setMaxAge(-1)//关闭浏览器结束4.把Cookie响应到浏览器
response.addCookie(cookie);
1.2.3如何查询Cookie
//获取客户端的Cookie 存储多个,要用数组
Cookie [] cookies=request.getCookies();
ifcookies!=null)
{
for(Cookie cookie : cookies){
if(cookie.getName().equals(name))
{
String value=cookie.getValue();
System.out.println(value);
}
}
}
1.2.4如何修改Cookie
只要保证Cookie名和路径一致就行
//先得到指定的Cookie
1.2.5如何删除Cookie
1.3 Cookie的生存周期
cookies.setMaxAge(-1);//设置生成时间
括号的取值:
>0有效期,单位是秒
=0失效,用于删除Cookie
<0 内存存储,关闭浏览器失效
1.4 Cookie的编码与解码(8.0版本及之前的版本存储中文需要编码与解码)
中文和英文字符不同,中文属于Unicode字符,在内存中占用4个字符,而英文属于ASCII字符,内存中只占2个字节。Cookie中使用Unicode字符时需要对Unicode字符进行编码,否则会出现乱码。编码可以使用java.net.URLEncoder类的encode(String str,String encoding)方法,解码使用java.net.URLDecoder类的decode(String str,String encoding)方法
代码:
运行结果:
1.5 Cookie的路径问题
1.5.1什么是Cookie的路径问题
1.5.2 发送Cookie的条件
浏览器在发送请求之前,首先会根据请求url中的域名在cookie列表中找所有与当前域名一样的cookie,然后再根据指定的路径进行匹配,如果当前请求在域匹配的基础上还与路径匹配那么就会将所有匹配的cookie发送给服务器,这里要注意的是最大匹配和最小匹配问题,有些cookie服务器在发送之前会有意扩大当前页面cookie的匹配范围,此时这些被扩大范围的cookie也会一起发送给服务器。
例如:cookie 存在于: http://localhost:8080/day13_cookie_01/
如果:发送的请求是:http://localhost:8080/day14/aServlet 的话,则不发送cookie到服务端
http://localhost:8080/day13_cookie_01/aServlet能发送cookie到服务器
1.6 Cookie的特点
优点:
1.可配置到期规则 Cookie 可以在浏览器会话结束时到期,或者可以在客户端计算机上无限期存在,这取决于客户端的到期规则。
2.不需要任何服务器资源 Cookie 存储在客户端并在发送后由服务器读取。
3.简单性 Cookie 是一种基于文本的轻量结构,包含简单的键值对。
4.数据持久性 虽然客户端计算机上 Cookie 的持续时间取决于客户端上的 Cookie 过期处理和用户干预,
Cookie 通常是客户端上持续时间最长的数据保留形式
5.cookie.setMaxAge(时间);//单位秒
缺点:
1.大小受到限制 大多数浏览器对 Cookie 的大小有 4096 字节的限制,尽管在当今新的浏览器和客户端设备版本中,支持 8192 字节的 Cookie 大小已愈发常见。
2.安全性低,存在于客户端
3.加密和解密需要额外的编码,另外解码和解密耗费一定的时间而影响应用程序的性能
2. 状态管理---Session
2.1 Session概述
2.1.1什么是Session
Session用于跟踪客户的状态。
Session指的是在一段时间内,单个客户与Web服务器的一连串相关的交互过程。
在一个Session中,客户可能会多次请求访问同一个网页,也有可能请求访问各种不同的服务器资源。
2.1.2 Session 工作原理
http:无状态 无连接
session被用于表示一个持续的连接状态,在网站访问中一般指代客户端浏览器的进程从开启到结束的过程。session其实就是网站分析的访问(visits)度量,表示一个访问的过程。
session的常见实现形式是会话cookie(session cookie),即未设置过期时间的cookie,这个cookie的默认生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。
实现机制是当用户发起一个请求的时候,服务器会检查该请求中是否包含sessionid,如果未包含,则系统会创造一个名为JSESSIONID的输出 cookie返回给浏览器(只放入内存,并不存在硬盘中),并将其以HashTable的形式写到服务器的内存里面;当已经包含sessionid是,服务端会检查找到与该session相匹配的信息,如果存在则直接使用该sessionid,若不存在则重新生成新的 session。
这里需要注意的是session始终是有服务端创建的,并非浏览器自己生成的。 但是浏览器的cookie被禁止后session就需要用get方法的URL重写的机制或使用POST方法提交隐藏表单的形式来实现
2.1.3 如何获得Session
2.1.4 如何使用session绑定对象
使用HttpSession的setAttribute(属性名,object)方法
2.1.5 如何删除Session
使用HttpSession的invalidate方法
2.2 Session超时
2.2.1什么是Session超时
HttpSession的最后一程访问时间和当前时间的差距大于了 指定的最大空闲时间,这时服务器
就会销毁Session对象。默认的空闲时间为30分钟。
2.2.2如何修改Session的缺省时间限制
使用HttpSession的setMaxAge设置,单位为秒
2.2.3 Session 失效的几种情况
1.超过了设置的超时时间
2.主动调用了invalidate方法
3.服务器主动或异常关闭
注意:浏览器关闭并不会让Session失效
Session和Cookie的区别
1,session存放在服务器端,cookie存放在客户端。
2,session会随着会话的结束而关闭,cookie则存放在客户端浏览器上长期有效。
3,session保存的是对象,cookie保存的是字符串
4,存放在cookie里的信息容易泄露,通常只保存不重要的信息,重要的信息放在session中