.Net转Java自学之路—基础巩固篇二十八(Cookie、Session)
Cookie:
Http协议规定:
1个Cookie最大4kb;1个服务器最多向一个浏览器保存20个Cookie;1个浏览器最多可以保存300个Cookie。
JavaWeb中使用Cookie:
原始方式:使用response发送Set-Cookie响应头;使用request获取Cookie请求头
便捷方式:使用response.addCookie()向浏览器保存Cookie;使用request.getCookie()获取浏览器兑换的Cookie
Cookie详解:
Cookie不是只有name和value两个属性。
maxAge:Cookie的最大生命周期,即Cookie可保存的最大时长。秒为单位。例:cookie.maxAge(60)
maxAge>0:浏览器会把Cookie保存到客户端硬盘上;有效时长为maxAge值。
maxAge<0:Cookie只在浏览器内存中存在,关闭浏览器,Cookie移除。
maxAge=0:浏览器会马上移除这个Cookie
path:Cookie的path并不是设置这个Cookie在客户端的保存路径。Cookie的path由服务器创建Cookie时设置。
当浏览器访问服务器某个路径时,是否需要归还Cookie给服务器,则时由Cookie的path来决定。
当浏览器访问服务器的路径,若包含某个Cookie的路径,那么九会归还这个Cookie。
Cookie的path默认值:当前访问路径的父路径。
domain:用来指定Cookie的域名;当多个二级域共享Cookie时才有用。
Session:
HttpSession概述:
HttpSession是由JavaWeb提供的,用来会话跟踪的类。session是服务器端对象,保存在服务器端。
HttpSession是Servlet三大域对象之一,所以它也有setAttribute()、getAttribute()、removeAttribute()方法。
三大域:request、session、application(ServletContext)
作用:
会话范围:会话范围是某个用户从首次访问服务器开始,到该用户关闭浏览器结束。
会话:一个用户对服务器的多次连贯性请求;所谓连贯性请求就是该用户多次请求中间没有关闭的浏览器。
服务器会为每个客户端创建一个session对象,session就好比客户在服务器端的账户,他们被服务器保存到一个Map中,这个Map被称为session缓存。
Servlet中得到session对象:HttpSession ses=request.getSession();
JSP中得到session对象:session是JSP内置对象之一,故、不用创建可直接使用。
原理:
request.getSession():获取Cookie中的sessionId
若sessionId不存在,创建session,把session保存起来,把新创建的sessionId保存到Cookie中。
若sessionId存在,通过sessionId查找sesion对象,若干没有找到,创建session,把session保存起来,把新创建的sessionId保存到Cookie中。
若sessionId存在,通过sessionId找到了session对象,那么就不会再创建session对象。
返回session
若创建了新的session,浏览器会得到一个包含了sessionId的Cookie,这个Cookie的生命为-1,即只在浏览器内存中存在,若不关闭浏览器,那么Cookie下次请求时,再次执行request.getSession()时,因为可以通过Cookie中的sessionId找到session对象,所以与上一次请求使用的是同一session对象。
request.getSession(true)与request.getSession():这俩个方法效果相同。
request.getSession(false):若session缓存中(如果Cookie不存在),不存在session,那么返回null,而不会创建session对象。
HttpSession其他方法:
String getId();//获取sessionId int getMaxInactiveInterval();//获取session的最大不活动时间。默认30分种。 void invalidate();//让session失效。 boolean isNew();//查看session是否为新。
web.xml中配置session的有效时长:
<session-config> <session-timeout>30</session-timeout> </session-config>
URL重写:
session依赖Cookie,目的是让客户端发出请求时归还sessionId,这样才能找到对象的session。
若客户端禁用了Cookie,那么就无法得到sessionId,那么session也就无用了。
也可以使用URL重写来替代Cookie:response.encodeURL(url);
该方法会对URL进行只能的重写;当请求中没有归还sessionId这个cookie,那么该方法会重写url,否则不重写。此url必须是本站的url。