一、为什么需要状态管理(会话管理)?
HTTP协议是无状态的,不能保存每次提交的额信息,即当服务器返回与请求想对应的应答之后,这次事务的所有信息就丢掉了。
如果用户发来一个新的请求,服务器无法知道它是否与上一次的请求有联系。
对于那些需要多次提交数据才能完成的web操作,比如:登录来说,就成问题了。
二、什么是状态管理(会话管理)?
web应用中的会话是指一个客户端浏览器与web服务器之间发生的一系列的请求和响应的过程。
web应用的会话状态是指web服务器与浏览器在会话的过程中产生的信息,借助会话状态,web服务器能够把属于同一个会话中的一系列的请求和响应过程联系起来。
作用时间:从打开浏览器访问某个网站到关闭该网站的过程(同一个浏览器)
三、状态管理的两种常见模式(会话技术)
客户端状态管理技术:将状态保存到客户端。代表:cookie技术(浏览器)
服务器状态管理技术:将状态保存在服务器端。代表:session技术(服务器传递sessionID时需要使用cookie的方式)
记录用户的登录状态。
四、什么是cookie
cookie是在浏览器访问web服务器的某个资源是,由web服务器在http响应消息头中附带传递给浏览器的一片数据,web服务器传递给各个客户端浏览器的数据可以各不相同.
一旦web浏览器保存了某个cookie,那么它在以后每次访问该web浏览器时,都应在http请求头中将这个cookie回传给web服务器。
web服务器通过在http响应消息中增加set-cookie响应头字段将cookie信息发送给浏览器
浏览器则通过在http请求头消息中增加cookie请求头字段将cookie回传给web服务器
一个cookie只能标识一种信息,它至少含有一个标识该信息的名称和设置值
注意:
一个web站点可以给一个web浏览器发送多个cookie,一个web浏览器也可以存储多个web站点提供的cookie
浏览器一般只允许存放300个cookie,每个站点最多存放20个cookie,,每个cookie的大小限制为4KB
五、如何创建cookie
修改时:只需要保证cookie的名称和路径和以前的一致即可修改
//创建Cookie
Cookie ck=new Cookie("code", code);
ck.setPath("/");//设置Cookie的路径
ck.setMaxAge(-1);//内存存储,取值有三种:>0有效期,单位秒;=0失效;<0内存存储
response.addCookie(ck);//让浏览器添加Cookie
六、如何查询cookie
//获取所有的Cookie
Cookie[] cks=request.getCookies();
//遍历Cookie
for(Cookie ck:cks){
//检索出自己的Cookie
if(ck.getName().equals("code"))
{
//记录Cookie的值
code=ck.getValue();
break;
}
}
七、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)方法
重要代码:
//web服务器tomcat:8.5之前的版本,存储中文:Control character in cookie value or attribute.
//可以对中文进行编码
String value = "易烊千玺";
//编码操作
value = URLEncoder.encode(value, "utf-8");
System.out.println("编码后:"+value);
Cookie c = new Cookie("uname", value);
c.setPath("/");
c.setMaxAge(-1);
response.addCookie(c);
取:
Cookie[] cookies = request.getCookies();
if (cookies!=null) {
for (Cookie cookie : cookies) {
//cookie键
String key = cookie.getName();
String value = cookie.getValue();
if ("uname".equals(key)) {
System.out.println("解码前:"+value);
value = URLDecoder.decode(value, "utf-8");//解码
}
System.out.println(key+"-----"+value);
}
}
八、cookie的路径问题
cookie一般是由用户访问页面而被创建的,可并不是在创建cookie的页面才可以访问这个cookie的。在默认的情况下,由于安全方面的考虑,只要与创建cookie的页面处于同一个目录或在创建cookie页面的子目录下的网页才可以访问,那么此时如果希望其父级或者整个网页都能够使用cookie,需要进行路径设置。
默认:
当前网页及其子目录下的网页可以访问 相当于 :cookie.setPath("/项目名");
手动:
父级或者整个网页都能够使用cookie 相当于 : cookie.setPath("/");
九、发送cookie的条件
浏览器在发送请求之前,首先会根据请求url中的域名在cookie列表中找所有与当前域名一样的cookie,然后再根据指定的路径进行匹配,如果当前请求在域匹配的基础上还与路径匹配那么就会将所有匹配的cookie发送给服务器,这里要注意的是最大匹配和最小匹配问题,有些cookie服务器在发送之前会有意扩大当前页面cookie的匹配范围,此时这些被扩大范围的cookie也会一起发送给服务器。
十、cookie的优缺点
cookie作用:
1.可以在客户端上保存用户数据,起到简单的缓存和用户身份识别等作用。
2.保存用户的登陆状态,用户进行登陆,成功登陆后,服务器生成特定的cookie返回给客户端,客户端下次访问该域名下的任何页面,将该cookie的信息发送给服务器,服务器经过检验,来判断用户是否登陆。
3.记录用户的行为。
cookie弊端:
1.增加流量消耗,每次请求都需要带上cookie信息。
2.安全性隐患,cookie使用明文传输。如果cookie被人拦截了,那人就可以取得所有的session信息。
3.Cookie数量和长度的限制。每个domain最多只能有20条cookie,每个cookie长度不能超过4KB,否则会被截掉。