一、Cookie简介
Cookie是客户端(一般指浏览器)请求服务器后服务器发给客户端的一个辨认标识,保存在客户端,当客户端再次向服务器发送请求时,会携带着这个辨认标识,服务器就可以通过这个标识来识别客户端的身份或状态等。
Cookie的作用:跟踪会话,记录一次会话中(即Session,一次会话可能会有多次请求,当然也可以有多个Cookie来跟踪不同的信息)的信息,这样服务器就会知道用户的状态,比如有没有登录成功,付款时购物车中的东西等,就相当于贴在客户端脑门上的纸条,浏览器看不到,但服务器看得到。
Cookie的应用:
1️⃣保持用户登录状态
2️⃣记录用户名:
3️⃣记录浏览过的信息网上商城的购物车和
二、Cookie的设置和获取
1、通过HttpServletResponse设置Set-Cookie响应头:需要注意cookie中的内容是一个个的键值对,也就是说Set-Cookie响应头中可以包含多个Cookie,各个Cookie键值对间使用;隔开
response.addHeader("Set-Cookie","cookie中的内容");
2、通过HttpServletResponse.addCookie的方式设置Cookie:注意new Cookie()时两个参数都是字符串
Cookie cookie = new Cookie("jieguo","true");
response.addCookie(cookie);
3、浏览器中查看cookie的内容:
4、服务端获取客户端携带的cookie:通过HttpServletRequest获取
Cookie[] cookies = request.getCookies();
if(cookies != null)
for(Cookie c : cookies){
String name = c.getName();//获取Cookie名称
if("jieguo".equals(name)){
String value = c.getValue();//获取Cookie的值
bool = Boolean.valueOf(value);//将值转为Boolean类型
}
}
Tip
:
1️⃣设置cookie用response,获取cookie用request
2️⃣cookie是不能跨浏览器的
5、Cookie的覆盖
如果服务器端向客户端发送重复的Cookie那么客户端原有的Cookie会被覆盖,例如客户端第一次请求服务器端,服务器端发送的Cookie是Set-Cookie:a=A,第二次请求发送的Cookie是Set-Cookie:a=AA,那么客户端只会留下后发送的Cookie,即a=AA
三、会话控制
HTTP协议有两大缺点:
1️⃣无态状
- 服务器不能区分不同浏览器不同用户发送的不同请求
- 不能知道多次请求是否发送自同一个用户
2️⃣纯文本:利用BeanUtils将传递的参数封装为对象克服了该缺点
服务器不能通过HTTP的请求报文来识别浏览器,但是我们又有这个需求。我们可以结合一下现实生活:我们现实生活中在看电影的时候,检票的人员是认票不认人的,也就是我们可以通过一张电影票来识别不同的用户。我们的服务器可不可以发给浏览器一张票呢?以后浏览器在访问服务器时就可以带着这张票,然后我们通过检查票的信息不就可以识别不同的浏览器了吗?
电影院的运作:
①电影院要创建票
②将电影票发给顾客
③顾客带着票去看电影
④电影院要检票
Cookie的流程:
①服务器创建Cookie
②将Cookie发送给浏览器
③浏览器带着Cookie来访问服务器
④服务器检查浏览器的Cookie
Cookie是服务器发送给浏览器的一张票,浏览器在收到这张票以后,每次访问服务器时都会带着这张票,服务器就可以根据票上的信息来识别不同的浏览器。
Cookie是一个请求头(或响应头):服务器以响应头的形式将Cookie发送给浏览器;浏览器以请求头的形式将Cookie发回给服务器。
服务器通过响应报文将Cookie发送给浏览器,具体格式如下:
//创建Cookie
Cookie cookie = new Cookie(name,value);
//发送Cookie
response.addCookie(cookie);
浏览器收到该响应头以后,会自动保存Cookie信息,并在以后的访问中携带该Cookie:
Set-Cookie: username=sunwukong; age=18
服务器端读取Cookie:
Cookie[] cookies = request.getCookies();
if(cookies != null)
for(Cookie c : cookies){
String name = c.getName();//获取Cookie名称
if("jieguo".equals(name)){
String value = c.getValue();//获取Cookie的值
bool = Boolean.valueOf(value);//将值转为Boolean类型
}
}
修改Cookie:Cookie一旦发送给浏览器,那么服务器将不能直接修改,但是可以通过使用同名Cookie来替换浏览器已有Cookie的方式,来间接的修改。浏览器收到新Cookie以后,就会将老的Cookie销毁,然后使用新的Cookie。
删除Cookie:通过设置同名Cookie的最大存活时间为0,删除Cookie是指使浏览器不再保存Cookie,使Cookie立即失效,举例:使name为username的Cookie立即失效
//1.创建一个name为username的Cookie
Cookie cookie = new Cookie("username", "aaa");
//2.设置Cookie的有效时间为0
cookie.setMaxAge(0);//删除cookie的关键
//3.将cookie发送给浏览器,来替换同名Cookie
response.addCookie(cookie);
Cookie的有效时间:Cookie发送给浏览器以后,浏览器并不会永久保存,也就是到了一定的时间以后浏览器会自动销毁Cookie。Cookie的默认有效时间为一次会话(一次打开关闭浏览器的过程),我们也可以手动指定Cookie的有效时间
//setMaxAge用来设置Cookie的最大有效时间,需要int型的参数,代表有效的秒数
cookie.setMaxAge(秒数);
//当参数大于0时,会设置为指定的秒数
cookie.setMaxAge(30);
//当参数等于0时,浏览器不会保存Cookie,Cookie立即失效
cookie.setMaxAge(0);
//当参数小于0时,和不设置是一样,当前会话有效
cookie.setMaxAge(-100);
//设置一个永久有效的Cookie,并非永久,只是使Cookie的生命很长而已
cookie.setMaxAge(60*60*24*365*10);
Cookie的Path:path指访问路径,此处是指浏览器在访问哪些地址时会携带该Cookie,默认情况下只要访问的资源是当前项目下的资源,浏览器就会带着该Cookie,也就是说Cookie默认的path是项目的根目录,我们可以手动指定Cookie的路径,Cookie路径由浏览器解析,所以需要加上项目名
// /11_WEB_Cookie/hello指凡是访问项目根目录下hello路径下的资源都会携带Cookie,否则不携带
cookie.setPath("/11_WEB_Cookie/hello");
四、Cookie的应用举例
1、保持用户的登录状态:不安全
将用户的信息保存到Cookie中,并发送给浏览器,并且将有效时间设置为一个较长的时间,这样浏览器在以后访问网站时,都会带着该Cookie,服务器以此来辨识用户,用户就不再需要输入用户名和密码等信息。但是Cookie是纯文本的,很容易被截获,所以我们在使用Cookie保存敏感信息时一般都需要进行加密。
2、广告的精确推送
我们在使用百度搜索时,它会将我们搜索的关键字之类的信息保存到Cookie中,当我们访问带有百度广告的链接时,该Cookie信息会自动发送给Baidu,百度就可以根据Cookie的信息给你推送广告
3、保存用户名:Taobao
一旦用户登录成功以后,下次再登录时,直接将Cookie中的用户名读取并显示出来,这样用户就不需要再次输入用户名,只输入密码即可。