1.Cookie是浏览器提供的一种技术,通过服务器程序能将一些只须保存在客户端,或者在客户端处理的数据,放在本地的计算机上,不需要通过网络传输,下次就可以直接使用,提高网页处理效率,减少服务器的负载,例如常见的记住密码就是通过Cookie实现的,因为Cookie是存储在客户端的,所以安全性非常低。
2.javax.servlet.http.Cookie:随着服务器端的响应发送给客户端,保存在浏览器,下次再访问服务器时再把Cookie发送给服务器。
3.Cookie的格式:键值对用“=”链接,多个键值对间通过“;”隔开。
4.Cookie的创建的发送:
通过new Cookie(“key”,“value”); 来创建Cookie对象,要想将Cookie随响应发送到客户端,需要将其添加到response对象中,response.addCookie(cookie); 此时该 cookie 对象则随着响应发送至了客户端。
package com.StartSL;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
/**
* @author Vodka
* @date 2021/08//23:39
*/
@WebServlet(name="Vodka",urlPatterns={"/One","/Two"})
public class SendCookie extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse res){
//设置并发送Cookie
Cookie ckOne = new Cookie("User","6666");
Cookie ckTwo = new Cookie("KeyWord","关键字");
res.addCookie(ckOne);
res.addCookie(ckTwo);
//获取cookie的数组
Cookie [] Cookies = req.getCookies();
//判断是否为空
if(Cookies != null && Cookies.length > 0){
for(Cookie CK : Cookies){
String Name = CK.getName();
String Value = CK.getValue();
System.out.println("名称:" + Name + " ,值: " + Value);
}
}
}
}
5.Cookie注意点:
1.一般cookie只保存在浏览器本机的内存中,不同浏览器之间的cookie不能相互使用。
2.cookie存中文问题: URLEncoder.encode(xxxxx)编码, URLDecoder.decode(xxxxx); 解码
3.同名cookie问题: 重复发送的cookie,新的覆盖旧的
4.浏览器存放cookie的数量:不同的浏览器限定的数量不同,cookie的存储是有上限的,可以结合Session来实现回话跟踪。
6.cookie的路径: Cookie的setPath设置cookie的路径(指定站点名),这个路径决定服务器请求是否直接从浏览器中加载某些cookie。
//情景一: 当前服务器下任何项目的任意资源都可以获取cookie对象
//当前项目路径为/One
Cookie ck = new Cookie("xxx","xxxx");
//设置路径为 “/” ,表示当前服务器下任何项目都可以访问到Cookie对象,
cookie.setPath("/");
response.addCookie(ck);
//情景二: 指定项目下的任意资源都可以获取Cookie对象
//当前项目路径为: /One
Cookie ck = new Cookie("xxx","xxxx");
//设置路径为 “/Two” ,表示当前Two项目下资源才可以访问到Cookie对象
cookie.setPath("/Two"); //就算Cookie是One产生的,One也不能获取它
response.addCookie(ck);
//情景三: 当前项目下的任意资源都可以获取Cookie对象 (默认情况:不设置Cookie的path)
//当前项目路径为: /One
Cookie ck = new Cookie("xxx","xxxx");
//设置路径为 “/One” ,表示当前项目下资源可以访问到Cookie对象
cookie.setPath("/One"); //因为默认情况就是这个,所以可以不设置
response.addCookie(ck);
//情景四: 指定目录下的资源可获取Cookie对象
//当前项目路径为:/One
Cookie ck = new Cookie("xxx","xxxx");
//设置路径为: "/One/main" ,表示在One/main目录下才可以访问到cookie对象
ck.setPath("/One/main");
response.addCookie(ck);
//实例代码
package com.StartSL;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @author Vodka
* @date 2021/08//18:22
*/
@WebServlet(urlPatterns = {"/vodka"})
public class CPath extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse res ){
Cookie ckOne = new Cookie("01" ,"01");
ckOne.setPath("/One");
res.addCookie(ckOne);
Cookie ckTwo = new Cookie("02" ,"02");
ckTwo.setPath("/");
res.addCookie(ckTwo);
Cookie ckThree = new Cookie("03","03");
ckThree.setPath("/three");
res.addCookie(ckThree);
Cookie ckFour = new Cookie("04","04");
ckFour.setPath("/four/main");
res.addCookie(ckFour);
}
}
总结:当访问路径的范围比cookie路径范围要大时(包含),则request对象带上cookie的内容;若范围较小(即不包含),则请求不会携带该cookie。