1.http状态管理
a.为什么要对http协议进行状态管理?
因为http协议是一个无状态的协议,优点是可以利用有限的资源对多个客户方服务。
但是,对于特定的应用,比如说购物系统,需要记录客户端的状态,此时,需要对http协议进行状态管理。
b.如何进行状态管理?
1.在客户端保存用户的状态,即将用户的状态保存在服务器端,即cookie技术;
2.在服务器端保存用户的状态,即将用户的状态保存在服务器端,即session技术;
2.cookie技术
1.什么是cookie技术?
浏览器访问某个服务器时候,服务器会创建一部分数据,在响应数据包中以消息头set-session的形式发送给浏览器,浏览器会将这部分数据保存下来。
当浏览器再次访问服务器的时候,会将这部分数据发送给服务器。通过这种方式,服务器可以维护用户的状态。
a.用法:
Cookie cookie=new Cookie(String name,String value);
response.addCookie(cookie);
cookie的生存时间,在默认的情况下,cooki会保存在内存当中,所以当浏览器关闭的时候,cookie会丢失。
但是我们可以设置cookie的生存时间,cookie.setMaxAge(int seconds);
second>0的时候:浏览器关闭,cookie会以文件的方式保存在硬盘上
second=0的时候:删除
second<0的时候:默认的方式,浏览器关闭,cookie会保存在内存;
b.编码问题:
cookie的值只能是Ascii字符,所以对于中文,可以将其转换成ascii字符。我们可以在保存cookie的值时,使用String URLEncoding.encode("张三",“utf-8”);
读取的时候,URLDecoder.decoder();
c.查询:
Cookie[] cookies=request.getCookie();
如果找不到任何的cookie,返回null
cookie.getName()获取cookie的名称
cookie.getValue()获取cookie的值
d.路径问题:
在创建cookie时候,都有一个默认的path,该值是创建该cookie的组件的地址。
此时,该path是 从应用名(也就是工程名)前面的‘’/‘’开始.
当浏览器访问服务器时候,会比较要访问的地址是否小于等于path,如果小于会把cookie携带给服务器;
d.1 我们可以修改path,使用cookie.setPath(" ")来修cookie的path
比如:cookie.setPath("/工程名"),那么访问工程名下的所有Servlet的时候,都会携带这个cookie
cookie.setPath("/")访问服务器所有的应用的时候,都会携带对应的cookie。
d.2我们还可以修改cookie域,比如:cookie.setDomain(".abc.com");那么浏览器会比较要访问的地址的
域名是否匹配,然后再比较path
e.cookie的限制
e.1 cookie只保存字符串,并且对于中文,需要编码。
e.2cookie的个数也有限制,本地的最大数量大约为300个左右
e.3cookie的大小也有限制(4k左右)
e.4cookie不是很安全
e.5cookie可以被用户禁止
使用的场合:记录用户的登录习惯。网页换肤。自动登录。购物车