版权声明:如需转载或引用请声明原文网址 https://blog.csdn.net/u013087359/article/details/81905623
1. Cookie
1.1 概述
- 服务器将某些数据发送到浏览器,然后再把数据临时存到用户电脑上
- Cookie主要用于存储用户信息、用户习惯、用户操作等数据
1.2 作用
- 用户可以实现自动登录,可以记住登录的用户名和密码,方便下次简化登录
- 电子商务网站(购物),可以记录你曾经选择的商品,在结账时可以将选择商品调出来,然后付账
- 可以记录用户的访问习惯、网页停留的时间、喜欢什么样的商品、进行什么搜索,也是网络营销手段
1.3 工作原理
- 服务器把某些数据存放到响应头中的Cookie中
- 浏览器根据Cookie信息把数据临时存放到本地中
- 客户端发送请求时浏览器会把本地有效的Cookie数据发送给服务器
- 服务器获取Cookie信息
1.4 缺点
- 因为cookie保存在浏览器上,所以安全性低
- 可控性比较差,只能存放字符串,不能存放数组和对象
- 因为数据存放在头信息中,所以增加请求数据的负载
- 大多数的浏览器对cookie有4K的限制
- Cookie可以被浏览器阻止
1.5 注意
- 不同浏览器的Cookie是不相通的
1.6 添加Cookie
//创建Cookie对象并设置存储的数据
Cookie cookie=new Cookie("name","zhangsan");
//把cookie响应到浏览器中
response.addCookie(cookie);
1.7 设置Cookie存储的有效时间
- 默认Cookie是存储在浏览器内存中,浏览器关闭后该Cookie也会失效
- 使用
setMaxAge()
可以设置过期时间,单位:秒,Cookie会写入到客户端的文件中,Cookie过期跟浏览器是否关闭没有关系
//设置过期时间是在当前时间的2分钟后
cookie.setMaxAge(60*2);
1.8 设置目录有效性
setPath()
设置只有访问指定目录下的文件,请求时才会携带该Cookie、- 默认设置的目录是跟添加Cookie的文件同一个目录
//1.默认设置的是跟当前文件同一个目录,假如url地址是http://localhost:6060/Web04/Servlet/CookieServlet,那么等同cookie.setPath("/Web04/Servlet");
//2.网站Web04所有资源都能访问该Cookie,如果默认的首页index.html和当前的CookieServlet
cookie.setPath("/Web04");
//3.服务器上所有的网站所有的文件都能访问
cookie.setPath("/");
1.9 移除Cookie
- 同名同目录有效性时间为0的Cookie进行覆盖就达到删除Cookie效果
//同名同目录有效性时间为0的Cookie进行覆盖就达到删除Cookie效果
//1.同名,值没限制
Cookie cookie=new Cookie("name",null);
//2.有效时间为0
cookie.setMaxAge(0);
//3.跟原Cookie设置的目录要一致
cookie.setPath("/");
1.10 获取Cookie
//需要查找Cookie的键名
String key="name";
String value = "";
//获取请求发送过来的所有Cookie
Cookie[] cookies = request.getCookies();
//遍历Cookie
for (Cookie cookie : cookies) {
//根据Cookie的键名对比查找相应的Cookie
if (cookie.getName().equals(key)) {
//获取当前Cookie的值
value = cookie.getValue();
break;
}
}
System.out.println(value);
2. Session
2.1 概述
- Session是一种会话技术;
- Session数据存在服务器端,相对于比较安全;
- Session是基于COOKIE的,如果COOKIE被禁用SESSION功能也会被影响
- Session可以存储多个类型的数据;
- Session文件没有大小限制;
- sessionid默认是整个网站都能访问(即使没有设置
cookie.setPath()
),所以session存储的数据跨request都有效
2.2 工作原理
- 把数据存放在服务器中,并把一个Session放到响应头Cookie中
- 浏览器把sessionid保存到本地中
- 客户端发送请求时浏览器会把本地有效的cookie中的sessionid发送给服务器
- 服务器根据sessionid查找存储的数据
2.3 注意
sessionid没有发送到服务器端或者服务器端存储的session被销毁都会导致session数据丢失,调用request.getSession()
会重新创建一个session
2.4 获取session和sessionid
//获取Session
//该方法会根据客户端传递过来的JSESSIONID在服务器的Session文件中查找是否存在对应的数据
//如果存在,则返回该Session,如果不存在则创建一个新的Session
HttpSession session=request.getSession();
//获取JSESSIONID的值
//1.使用request对象获取,如果第一次访问没有携带sessionid会返回null
String sessionId1=request.getRequestedSessionId();
//2.使用session对象获取
String sessionId2=session.getId();
//3.使用cookie键为JSESSIONID查找其值
2.5 域对象
- session域存储的数据在session失效前可以被整个网站应用任何动态资源访问(跨请求丶跨资源)
//存储数据到session域中
session.setAttribute("name", "zhangsan");
//获取session存储数据强转前要判断数据是否为null,因为session可能会过期
Object obj=session.getAttribute("name");
String name=obj==null?null:(String)obj;
//移除session中的数据
session.removeAttribute("name");
2.6 sessionid存储在客户端的有效时间
- sessionid是存储在Cookie中的,所以也是默认关闭浏览器sessionid的Cookie会失效
- 通过设置JSESSIONID的Cookie的有效时间来把JSESSIONID存在到客户端的本地文件中
HttpSession session=request.getSession();
//同名同值的sessionid的cookie
Cookie cookie=new Cookie("JSESSIONID",session.getId());
//设置sessionid的cookie有效存储6小时
cookie.setMaxAge(60*60*6);
//响应到客户端覆盖掉原先的sessionid的cookie
response.addCookie(cookie);
2.7 服务器端session定时销毁
- 默认连续30分钟该客户端没有发送请求到服务器端(不要求一定要调用session),则该session就会自动被销毁
- 可以在web.xml设置销毁session的连续空闲时间间隔
<web-app>
<session-config>
<!-- 设置销毁session的连续空闲时间间隔,单位是分钟 -->
<session-timeout>10</session-timeout>
</session-config>
</web-app>
2.8 手动销毁存储在服务器端的session
//销毁session
session.invalidate();