javaweb复习——session和cookie

Cookie

概述

Cookie翻译成中文是小甜点,小饼干的意思。在HTTP中它表示服务器送给客户端浏览器的小甜点。其实Cookie就是一个键和一个值构成的,随着服务器端的响应发送给客户端浏览器。然后客户端浏览器会把Cookie保存起来,当下一次再访问服务器时把Cookie再发送给服务器。

你大可以放心,Cookie不会占满你的硬盘。因为一个Cookie最多只有4KB,并且浏览器最多可以保存300个Cookie。当然,在浏览器大战的今天,一些浏览器为了打败对手,可能对Cookie规范“扩展”了一些,例如每个Cookie的大小为8KB,最多可保存500个Cookie等!但也不会出现把你硬盘占满的可能!

不同的浏览器之间不能共享Cookie!!!

cookie保存与读取

保存:
在这里插入图片描述

void addCookie(Cookie c)添加Cookie对象到当前response对象中,这个方法可以被调用多次,从而完成添加多个Cookie对象到response中。

Cookie的大小是有限的,浏览器最多可以保存300个Cookie,一个Cookie最多只有4KB,如果超出最大容量就会报如下错误。

在这里插入图片描述
读取:

Cookie[] getCookies()

注意,它返回的是Cookie数组,而不是一个Cookie对象。如果请求中没有Cookie,那么该方法返回null。

		Cookie[] cs = request.getCookies();
		if (cs != null) {
			for (Cookie c : cs) {
				String str = c.getName() + ": " + c.getValue() + "<br/>";
				response.getWriter().print(str);
			}
		}

Cookie的生命周期

Cookie会在客户端存活多久呢?这就是Cookie的生命了。默认情况下,Cookie只在浏览器的内存中存活,也就是说,当你关闭浏览器后,Cookie就会消失!

可以使用Cookie#setMaxAge(int expiry)来设置Cookie的存活时间。参数expiry表示Cookie存活的秒数。

相关方法:

方法方法描述
cookie.setMaxAge(60*60)表示cookie对象可存活1小时。就算关闭浏览器,就算重启客户端电脑,cookie也会存活1小时。因为当maxAge大于0时,浏览器不仅会把cookie保存在浏览器内存中,还会把cookie保存到硬盘上。
cookie.setMaxAge(-1)cookie的maxAge属性的默认值就是-1(其实只要是负数都是一个意思),表示只在浏览器内存中存活。一旦关闭浏览器窗口,那么cookie就会消失。
cookie.setMaxAge(0)cookie被作废!表示cookie即不在内存中存活,也不在硬盘上存活,这样的cookie设置只有一个目的,那就是覆盖客户端原来的这个cookie,使其作废。

Cookie的路径

Cookie还有一个path属性,可以通过Cookie#setPath(String)方法来设置。你可以使用HttpWatch查看响应中的Set-Cookie中是否存在路径。下面是通过FireFox查看Cookie信息。
在这里插入图片描述
也就是说,就算你不设置Cookie的path,Cookie也是有路径的。这个路径就是请求的路径。例如在请求http://localhost/day07_03/AServlet时,服务器响应了一个Cookie,那么这个Cookie的默认路径就是/day07_03/。

例如请求的路径是http://localhost/day07_03/servlet/BServlet时,服务器响应了一个Cookie,那么这个Cookie的默认路径就是/day07_03/servlet/。
在这里插入图片描述
到现在我们还没说过Cookie的path有什么用,现在我们来聊聊path的作用。首先声明一点,path不是指Cookie在客户端存放的路径!!!不同的浏览器存放Cookie的路径是不同的!!!你不能通过Cookie的path来指定Cookie文件的存放路径!!!

那么Cookie的path是干什么的呢?假设你的浏览器当前已经有了两个Cookie:

  • c1:name=id; value=itcast; path=/day07_03/;
  • c2:name=name;value=qdmmy6; path=/day07_03/servlet/。

当访问http://localhost/day07_03/*时,请求头中会包含c1,而不会包含c2。

当访问http://localhost/day07_03/servlet/*时,请求头中会包含c1和c2。

也就是说,在访问子路径时,会包含其父路径的Cookie,而在访问父路径时,不包含子路径的Cookie。

如果你想在BServlet中设置的Cookie,在客户端访问AServlet时也包含在请求头中,那么就需要设置BServlet中的Cookie的path:

  • c2.setPath(“/day07_03/”):硬编码;
  • c2.setPath(request.getContextpath() +
    “/”):活编码。

这样就可以设置Cookie的路径,保存在访问AServlet时,也会包含BServlet中添加的Cookie。

Cookie的SetPath设置cookie的路径,这个路径直接决定服务器的请求是否会从浏览器中加载某些cookie。

首先默认情况如果不设置cookie的path,默认是 /项目名称/当前路径的上一层地址如:请求路径:/cookie_demo/servlet/login, cookie的路径:/cookie_demo/servlet

如果我们设置path,如果当前访问的路径包含了cookie的路径(当前访问路径在cookie路径基础上要比cookie的范围小)cookie就会加载到request对象之中。

Cookie中保存中文

Cookie中是不可以设置中文的,但可以使用URLEncodor.encode()方法编码后在存放到Cookie中。

在获取Cookie时,需要先使用URLDecoder.decode()方法解码,再使用。

String name = URLEncoder.encode("姓名", "UTF-8");
String value = URLEncoder.encode("张三", "UTF-8");
Cookie c = new Cookie(name, value);
c.setMaxAge(3600);
response.addCookie(c);
response.setContentType("text/html;charset=utf-8");
Cookie[] cs = request.getCookies();
		if(cs != null) {
			for(Cookie c : cs) {
				String name = URLDecoder.decode(c.getName(), "UTF-8");
				String value = URLDecoder.decode(c.getValue(), "UTF-8");
				String s = name + ": " + value + "<br/>";
				response.getWriter().print(s);
			}
		}

HttpSession

概述

session也是域对象之一,它的范围是在一个会话范围内有效。session既然是域对象,那么当然就要有getAttribute()和setAttribute()系列方法了。

在一个会话内共享一个session对象,所以session中可以保存一个会话内的数据。例如当前用户的信息。

session的范围大于request,可以在一个会话中多个请求之间共享数据。但session的范围小于ServletContext(application),session不能在多个用户之间共享数据。

目前所学过的域对象的作用范围:
ServletContext > HttpSession > HttpServletRequest

基本可以理解为session是一个浏览器的范围,但是把浏览器关掉就消失了。

使用request.getSession()方法就可以获取session对象。

有了session,就不用使用Cookie来跟踪会话了!但是session不能像Cookie那样长命,一旦用户关闭浏览器窗口,那么session就死掉了。

session原理

我们都知道HTTP是无状态协议1,但是为什么session可以跟踪会话状态呢?没错,session依赖Cookie。

当客户端第一次访问服务器时,服务器会为客户端创建一个session对象,然后把session对象放到session池中,在响应时把sessionId通过Cookie响应给客户端。注意,只有在第一次访问时,服务器才会创建session,给客户端响应sessionId。从此以后就不会了!

当客户端再次访问服务器时,会在请求中带着sessionId给服务器,服务器通过sessionId到session池中找到session对象,这就可以完成会话跟踪了。也就是说,服务器端保存的是session对象,而客户端只有sessionId。每次访问都需要通过客户端的sessionId来匹配服务器端的session对象!这样用户在session中保存的数据就可以再次被使用了。

sessionId是服务器通过Cookie发送给客户端浏览器的,这个Cookie的maxAge为-1,即只在浏览器内存中存在。如果你关闭所有浏览器窗口,那么这个Cookie就会消失了!
在这里插入图片描述

session失效

session失效有如下几个原因:

  • session.invalidate()方法注销session
  • session超时
	<session-config>
	  	<!-- session的超时时间,以分钟为单位 -->
	  	<session-timeout>1</session-timeout>
	</session-config>
  • Cookie被禁用

  1. 无状态协议是指比如客户获得一张网页之后关闭浏览器,然后再一次启动浏览器,再登录该网站,但是服务器并不知道客户关闭了一次浏览器。 ↩︎

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值