Java笔记 - Cookie & Session
程序员文章站
2022-03-11 16:36:37
...
会话技术
会话:在客户端和浏览器之间,一次会话中包含多次请求和响应
一次会话
浏览器访问服务器,给服务器资源发送请求,建立会话,直到有一方断开为止
功能
在一次会话内,多次请求间的范围内共享数据
方式
- 客户端会话技术 Cookie
- 服务器会话技术 Session
Cookie
概念:客户端会话技术,将数据保存到客户端
步骤
- 创建Cookie对象,绑定数据
- 发送Cookie对象 Demo1设置了一个响应头Set-Cookie: msg=hello! 保存到客户端浏览器中
- 获取Cookie,拿到数据 Demo2有了一个请求头Cookie: msg=hello!
案例1
Demo1发送Cookie ,Demo2 接收Cookie
@WebServlet("/CookieDemo01")
public class CookieDemo01 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//创建cookie
Cookie cookie = new Cookie("msg","hello!");
response.addCookie(cookie);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
@WebServlet("/CookieDemo02")
public class CookieDemo02 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//创建cookie
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
String name = cookie.getName();
String value = cookie.getValue();
System.out.println(name + ":" + value);
}
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
细节
-
一次可以发送几个Cookie?
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //尝试创建多个Cookie Cookie c1 = new Cookie("msg", "hello"); Cookie c2 = new Cookie("name", "tung"); //使用响应头来设置 response.addCookie(c1); response.addCookie(c2); }
-
Cookie能否存中文?
Tomcat8之后支持中文,我装的是9,为什么不行❓
-
Cookie在浏览器中保存多久?
默认:浏览器关闭后自动清除Cookie
持久化:
setMaxAge(int seconds)
seconds表示存活时间- 正数:持久化存储,写到硬盘的文件中
- 负数:默认值 (可省略)
- 0:删除Cookie信息
-
Cookie 的范围多大?
默认情况下不能共享
设置Cookie范围:setPath(String path),把虚拟路径设置成大一级
如果要在不同的Tomcat服务器之间共享Cookie?
setDomain(String path):如果设置一级域名相同,那么多个服务器之间cookie可以共享
-
特点
- 浏览器对单个cookie存储有限制(4kb),对同一个域名下的总cookie数量也有限制(20个)
- cookie一般存储不太敏感的数据
- 作用:在不登录的情况下,完成服务器对客户的身份识别
Session
概念
客户端会话技术,将数据保存到服务器中。 HttpSession
存储一次会话的多次请求的数据
举个例子,在未登录淘宝账号的情况下把商品添加到购物车里,关闭浏览器,再次打开仍旧在,其实就是调用了Session
HttpSession 对象的方法
- getAttribute
- setAttribute
- removeAttribute
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取对象
HttpSession session = request.getSession();
//使用对象
Object msg = session.getAttribute("msg");
System.out.println(msg);
}
原理
Session是依赖于Cookie的,通过请求/响应头中的 JSESSIONID 来确定是同一个Session
细节
-
客户端关闭后,服务器未关闭,两次Session是否为同一个?
默认情况下不是同一个
可以通过Cookie来缓存JSESSIONID
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(); System.out.println(session); Cookie cookie = new Cookie("JSESSIONID",session.getId()); cookie.setMaxAge(60*60); response.addCookie(cookie); }
-
客户端不关闭后,服务器关闭,两次Session是否为同一个?
不是同一个
-
Session 的生存时间?
Session 被销毁的情况
- 服务器被关闭
- Session调用自杀方法 invalidate()
- 默认失效时间 30 分钟 (可以改)
Cookie - 小饼干 | Session - 主菜 |
---|---|
存储数据的大小有限制,只能存储 String 类型的对象 | 可以存储任意大小的数据,可以存任意类型 |
保存在客户端 | 保存在服务器 |
不安全 | 安全 |
客户端可以禁用Cookie | 无法被禁用 |
推荐阅读