一、状态管理概述
HTTP协议是无状态的,不能保存每次提交的信息,即当服务器返回与请求相对应的应答之后,这次事务的所有信息就丢掉了。
如果用户发来一个新的请求,服务器无法知道它是否与上次的请求有联系。
对于那些需要多次提交数据才能完成的Web操作,比如登录来说,就成问题了。
什么是状态管理
WEB应用中的会话是指一个客户端浏览器与WEB服务器之间连续发生的一系列请求和响应过程。
WEB应用的会话状态是指WEB服务器与浏览器在会话过程中产生的状态信息,借助会话状态,WEB服务器能够把属于同一会话中的一系列的请求和响应过程关联起来。
状态管理有两种技术,分别是客户端状态管理Cookie技术和服务器状态管理session技术
二、Cookie应用
1、什么是Cookie
Cookie是在浏览器访问WEB服务器的某个资源时,由WEB服务器在HTTP响应消息头中附带传送给浏览器的一小段数据,WEB服务器传送给各个客户端浏览器的数据是可以各不相同的。
一旦WEB浏览器保存了某个Cookie,那么它在以后每次访问该WEB服务器时,都应在HTTP请求头中将这个Cookie回传给WEB服务器。
WEB服务器通过在HTTP响应消息中增加Set-Cookie响应头字段将Cookie信息发送给浏览器,浏览器则通过在HTTP请求消息中增加Cookie请求头字段将Cookie回传给WEB服务器。
一个Cookie只能标识一种信息,它至少含有一个标识该信息的名称(NAME)和设置值(VALUE)。
一个WEB站点可以给一个WEB浏览器发送多个Cookie,一个WEB浏览器也可以存储多个WEB站点提供的Cookie
浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB
2、创建Cookie
1)、创建cookie
Cookie cookie = new Cookie("username","booy");
2)、设置属性
setMaxAge()
:有效期以秒计,默认-1保存在内存中,浏览器关闭销毁,设置0表示立即销毁
setPath()
:有效路径,空表示同级目录,/表示所有项目
setHttpOnly()
:表示只有http协议可读
cookie.setMaxAge(60*60*24*365);
cookie.setPath("/");
cookie.setHttpOnly(true);
3)、添加cookie
response.addCookie(cookie);
3、查询Cookie
//获取所有的Cookie
Cookie[] cookies = request.getCookies();
for (Cookie cookie : cookies) {
//检索自己的cookie
if("username".equals(cookie.getName())){
System.out.println(cookie.getValue());
}
}
4、修改Cookie
只需要保证Cookie的名和路径一致即可修改
//创建Cookie
Cookie ck=new Cookie("code", code);
ck.setPath("/");//设置Cookie的路径
ck.setMaxAge(-1);//内存存储,取值有三种:>0有效期,单位秒;=0失效;<0内存存储
response.addCookie(ck);//让浏览器添加Cookie
注意:如果改变cookie的name和有效路径会新建cookie, 而改变cookie值、有效期、和httponly会覆盖原有cookie
5、Cookie的编码与解码
中文和英文字符不同,中文属于Unicode字符,在内存中占用4个字符,而英文属于ASCII字符,内存中只占2个字节。Cookie中使用Unicode字符时需要对Unicode字符进行编码,否则会出现乱码。编码可以使用java.net.URLEncoder类的encode(String str,String encoding)方法,解码使用java.net.URLDecoder类的decode(String str,String encoding)方法(不建议cookie使用中文)
代码如下:
保存:Servlet类
// 使用中文的 Cookie. name 与 value 都使用 UTF-8 编码.
Cookie cookie = new Cookie(
URLEncoder.encode("姓名", "UTF-8"),
URLEncoder.encode("老邢", "UTF-8"));
// 发送到客户端
response.addCookie(cookie);
读取:Servlet读取
if(request.getCookies() != null)