一会话跟踪技术
1.1什么是会话
会话,简单来理解的话,可以理解成客户端与服务器的一次会晤,其中包括多级请求和转发。再简单一点说的话,就是从打开浏览器访问服务器上的资源到关闭浏览器的这个过程,我们称之为会话。从用户发起的第一个请求开始,到用户关闭浏览器,会话结束了。
1.2什么是会话跟踪技术
什么是会话跟踪技术呢?就是我们在一个会话的多次请求中如何共享数据?
1.3用Cookie或是Session完成会话跟踪技术
我们知道HTTP协议是无状态协议,也就是对每一次请求来说都是独立的请求,无法记住上一次的请求状态。但THHP协议中可以使用Cookie来完成会话跟踪技术。
在javaweb中,可以用Session来完成会话跟踪技术,Session底层依赖Cookie技术。
二Cookie概述
2.1什么是Cookie
Cookie翻译成中文就是小甜点,小饼干的意思。在HTTP中它表示服务器送给客服端浏览器的小甜点。Cookie就是一个键一个值构成的。随着服务器的响应被发送到浏览器,然后浏览器会把Cookie保存起来,当下一次访问服务器的时候再带给服务器。
2.2Cookie规范
*每个Cookie的上限为4kb
*一个服务器最多在客服端保存20个Cookie
*一个浏览器最多可以保存300个Cookie
上面的规范是HTTP的规范,但现实情况是,由于浏览器之间的竞争太激烈了,所有很多浏览器都没有很好的遵守这些规范,比如说,允许每个Cookie的大小为8kb,浏览器可以保持500个Cookie啊等等之类的,不过请你放心的是,就是浏览器能保存500个Cookie,也不会占你很多内存的。
特别要注意的是:Cookie不能跨浏览器使用,比如说,你用IE浏览器访问服务器,然后服务器把Cookie发给IE浏览器,然后IE把这些Cookie保存起来,然后你用谷歌浏览器去访问服务器,不可能把保存在IE中的Cookie带到服务器去的。
2.3Cookie与HTTP头
Cookie是通过HTTP响应和请求头在浏览器和服务器之间传递的。
*****Cookie: 请求头,客服端发送给服务器端;
格式:Cookie:a=A;b=B.即多个Cookie用分号隔开
*****Set-Cookie:响应头,服务器向客服端发送
格式:Set-Cookie: a=A
Set-Cookie:b=B
2.4Cookie的覆盖
如果服务端发送重复的Cookie,那么会覆盖原来的Cookie,比如说第一次请求服务器发回的Set-Cookie:a=A,第二次请求服务器发回的是set-Cookie:a=AA,那么浏览器只会保存一个Cookie即a=AA.
三Cookie的生命
3.1什么是Cookie的生命
Cookie中不仅有键和值,Cookie也有生命,所谓Cookie的生命,是指,Cookie可以存在多久。
可以通过setMaxAge(int)来设置Cookie的有效时间
*****cookie.setMaxAge(-1),Cookie的maxAge属性的默认值是-1,表示只在浏览器来存活,也就是说,一旦浏览器关闭了,Cookie也叫消失了。
*****cookie.setMaxAge(1 * 60 * 60),表示Cookie可以存在一个小时,当Cookie的maxAge属性的值大于0时,浏览器就会把Cookie保存到本地硬盘上,这样就算浏览器被关闭了,下次开启浏览器后,一样可以使用Cookie。
*****cookie.setMaxAge(0),如果Cookie的属性maxAge的值被设置为0,这是一个介于-1与大于0之间的数,它表示此Cookie作废,也就是删除Cookie,不管这个Cookie是在浏览器中还是被保存在硬盘中。
3.2案例:显示上次的访问时间
response.setContentType("text/html;charset=UTF-8");
Cookie cookie = new Cookie("lastTime", new Date().toString());
cookie.setMaxAge(60*60);
response.addCookie(cookie);
Cookie[] cookies = request.getCookies();
String s = "这是您第一次访问!!!";
if(cookies != null){
for (Cookie cookie2 : cookies) {
if(cookie2.getName().equals("lastTime")){
s = "您上次的访问时间是:" + cookie2.getValue();
}
}
}
response.getWriter().write(s);
四Cookie的Path
4.1什么是Cookie的路径
现在比如说有个web项目A,它已经向浏览器发送了10个Cookie,也就是说,以后每次访问项目A的时候,都会把这10个Cookie给带上,但假如说,现在访问的Servlet只需要其中的一个Cookie,如果我们没有设置Cookie的路径,就会把10个Cookie都带上,但其中九个是多余的,也是说浏览器会把多余的Cookie带到服务器去。
可以通过Cookie的path来给浏览器指定,在访问什么资源时,把什么Cooker带上。
4.2设置Cookie的路径
设置Cookie的路径,可以使用setPath()方法,例如:cookie.setPath("/AServlet");
如果没有设置Cookie的路径,则默认的值为当前访问资源的路径
比如说,当前访问的资源的路径为:
*****http://localhost:8080/javaee/Aservlet.则此时Cookie的路径为:/javaee
*****http://localhost:8080/javaee/servlet/Bservlet,则此时Cookie的路径为:/javaee/servlet
*****http://localhost:8080/javaee/jsp/CServlet,则此时Cookie的路径为:/javaee/jsp
五Cookie中保存中文
Cookie中键和值都不能使用中文,如果要只用中文的要使用URL进行编码,然后把编码后的中文放在Cookie中。
代码示例:
向客服端响应中添加Cookie
String key = "姓名";
String value = "小明";
key = URLEncoder.encode(key, "UTF-8");
value = URLEncoder.encode(value, "UTF-8");
Cookie cookie = new Cookie(key, value);
cookie.setMaxAge(1 * 60 * 60);
response.addCookie(cookie);
从客服端请求中Cookie
response.setContentType("text/html;charset=UTF-8");
Cookie[] cookies = request.getCookies();
for (Cookie cookie : cookies) {
String key = URLDecoder.decode(cookie.getName(), "UTF-8");
String value = URLDecoder.decode(cookie.getValue(), "UTF-8");
String s = key + ":" + value;
response.getWriter().write(s);
}