目录
Cookie
1.Cookie的概述
Cookie是http协议指定的,由服务器保存Cookie到浏览器,浏览器在下次请求服务器时把上次得到Cookie归还给服务器
其是由服务器创建保存到客户端浏览器的一个键值对,服务器保存Cookie的响应头:Set-Cookie:aaa=AAA
当浏览器请求服务器时,会把该武器保存的Cookie随请求发送给服务器,浏览器归还Cookie的请求头:Cookie:aaa=AAA
http协议对Cookie的规定:
1个Cookie最大4KB
1个服务器最多可以向1个浏览器保存20个Cookie
1个浏览器最多可以保存300个Cookie
注:浏览器都会在一定范围违反Http规定
2.Cookie的用途
服务器使用Cookie来跟踪客户端状态
例如:
保存购物车(其不能使用request保存,因为他是一个用户向服务器发送多个请求信息)
显示上次的登录名(与购物车同理)
3.javaweb对Cookie的使用
在jsp的代码块中
Cookie cookie1 = new Cookie("aaa","AAA");
Cookie cookie2 = new Cookie("bbb,"BBB");
responsn.addCookie(cookie1);//向浏览器保存Cookie
responsn.addCookie(cookie2);
Cookie[] cookies = request.getCookie();//获取浏览器归还的Cookie
if(cookies != null){
for(Cookie c : cookies)
out.print(c.getName()+"="+c.getValue()+"<br/>";
}
4.Cookie的属性
键值对属性:Name,Value
生命属性:maxAge->Cookie可以保存的最大时长,以秒为单位
maxAge>0:浏览器会把Cookie保存到客户端硬盘上,有效时长为maxAge的值
maxAge<0:Cookie只在浏览器内存中存在,当用户关闭浏览器时,Cookie释放内存
maxAge=0:浏览器会马上删除这个Cookie
使用方法:
Cookie cookie1 = new Cookie("aaa","AAA");
cookie1.setMaxAge(60);//保存在客户端硬盘上60s
response.addCookie(cookie);
路径属性:path(默认在相应页面目录下)
不是设置Cookie在客户端的保存路径,而是由服务器创建Cookie时设置的
当浏览器访问服务器某个路径时,path用于确定浏览器需要归还的那个Cookie
即,浏览器访问服务器路径,如果包含某个Cookie的路径,则会归还这个Cookie
设置方法:cookie.setPath("/");
域属性:domain
domain用于指定Cookie的域名,当多个二级域中共享Cookie时使用
例如:www.baidu.com,zhidao.baidu.comn,news.baidu.com…
设置方法:cookie.setDomain(".baidu.com")
HttpSession
1.概述
HttpSession底层依赖Cookie,是服务器端对象,保存在服务器端,用来会话跟踪的类(会话:一个用户对服务器的多次连贯请求)
属于Servlet三大域对象之一,所以也具有:setAttribute(),getAttribute(),removeAttribute()三个方法
服务器会为每个客户端创建一个session对象,session被服务器保存到一个Map中,即session缓存
2.使用
Servlet中获取session对象:
HttpSession session = request.getSession();
//session是jsp内置对象,不用创建直接使用
session域相关方法:即域对象的三大方法
3.HttpSession的原理
Servlet执行request.getSession()方法或访问jsp页面,会自动获取Cookie中的JSESSIONID:
如果sessionId不存在,则创建session,把session保存起来,新创建的sessionId保存到Cookie中
如果sessionId存在,通过sessionId查找session对象,如果没有查找到,则创建session,并把session保存起来,新创建的sessionId保存到Cookie中
如果sessionId存在,通过sessionId查找到session对象,那么不再创建session对象
补:getSession(fasle)->如果session缓存中不存在session,那么返回null,而不会创建session对象
4.HttpSession的其它方法:
String getId():获取JSESSIONID
int getMaxInactiveInterval():获取session可以得最大不活动时间(秒),默认为30分钟
可以在web.xml中配置:
<session-config>
<session-timeout>20</session-timeout>
</session-config>
void invalidate():让session失效,当客户端再次请求时,服务器会为其创建一个新的session
boolean isNew():查看session是否为新
5.URL重写
session依赖cookie,目的是让客户端发出请求时归还sessionid,使其能找到对应的session
如果客户端禁用cookie,则无法得到sessionid,那么就无法获取相应的session
解决方法:使用URL重写,即:
网站所有请求链接、表单都添加一个特殊的请求参数(sessionid),当服务器不能通过cookie获取sessionid时可以通过参数得到sessionid,从而找到session对象
常用方法:response.encodeURL(String url)//对url进行智能重写,在请求没有归还sessionid的cookie时,自动重写url