Session
会话:
- 对应的英文单词:session
- 用户打开浏览器,进行一系列操作,然后关闭浏览器。整个过程叫做一次会话
- 一个会话包含多次请求
session机制属于B/S结构的一部分,主要的作用就是为了保存会话状态。(用户登录成功后,将用户一直登录的状态保存到会话中)
使用session机制的原因
- 因为HTTP协议是一种无状态协议
- 无状态:请求的时候,B和S是连接的,当请求结束后,连接断开。
- 可以降低服务器的压力。
- 为了保存会话状态,只能使用session。
- 不使用request和application的原因
- request的作用域太小:一次请求过后就销毁,再次请求,request对象不是同一个。
- application的作用域太大:一个应用一个,浏览器打开~关闭,再打开一个浏览器,还是同一个application对象,不符合一次会话状态。
- 从浏览器打开到关闭,session对象都是同一个。
session的实现原理
图片描述:
文字描述:
- 浏览器第一次访问服务端,服务端会生成一个对象以及对应的sessionId,将sessionId返回给浏览器
- 浏览器拿到这个sessionId后,以cookie的形式保存sessionId
- 下一次访问服务端的时候,自动将浏览器内存中的sessionId发送给服务端,服务端根据sessionId找到对应的session对象
- 关闭浏览器后,内存消失,cookie消失,sessionId消失,会话结束
第一次访问,response中收到一个服务端返回的sessionId,以cookie的形式存储=7A
下一次再访问的时候,会自动的将sessionId发送给服务端
cookie禁用
服务端正常向浏览器发送sessionId,但是浏览器拒收,所以浏览器器每次访问服务端,返回的session对象都是全新的。
如果想在cookie禁用情况下,使用session机制:
使用URL重写机制:http://localhost:8080/testSession;jsessionid=E62524626BE76547D7287F6B7BB73239
这样的成本较大,因为每次访问服务路径,都需要拼接一个sessionId。
总结
- session是保存在服务端的,由服务端负责创建
- 创建的方法:
- request.getSession(); // 获取到一个session对象
- request.getSession(false); // 会判断当前session是否存在,不存在返回的session对象是null
- 因为HTTP协议的B/S结构,浏览器关闭,服务端是不知道,所以session并不会销毁,当一段时间内session对象没人操作,这个session对象就会销毁,默认时间是30分钟。
- 一次会话:session创建~session销毁
- session两种模式:
- 手动销毁:服务端调用API:invalidate();
- 超时销毁:一段时间内没人操作session对象
Cookie
- 在session的实现原理中,每一个session对象都有一个对应的sessionId。
- 例如:JSESSIONID=5CB05924651451FD94F42011461CC4FB,这个键值对数据就是一个cookie实例。
- 只要浏览器不关闭,用户再次发起请求,浏览器会自动将"运行内存"中的cookie发送个服务端
- 服务端根据"5CB05924651451FD94F42011461CC4FB"这个值去找对应的session对象
- cookie中的key 和 value都是字符串
保存位置
- 最终保存在浏览器客户端上
- 也可以保存在运行内存上【浏览器关闭后cookie就消失】
- 还可以保存在磁盘文件上【永久保存】
作用
- cookie和session一样,都是为了保存会话状态
java中操作cookie
创建cookie实例:
1. Cookie product = new Cookie("productId","1gaga3g23t32g"); 2. Cookie user = new Cookie("name","admin");
设置cookie的有效时间
- 有效时间 > 0 该cookie写入到磁盘中。
- 有效时间 = 0 该cookie写入到磁盘中,覆盖之前设置的cookie,也可以理解为删除cookie
- 有效时间 < 0 该cookie会被保存到浏览器运行内存上
- 不设置 该cookie会被保存到浏览器运行内存上
1. // 设置有效时间 2. product.setMaxAge(60 * 60);
设置cookie关联的路径
举例URL:http://localhost:8080/cookie/create
默认关联的路径为:http://localhost:8080/cookie/*,这些路径浏览器都会自动发送cookie到服务端
如果设置了关联路径,就以设置为主
product.setPath("/cookie");
返回cookie给浏览器
response.addCookie(product);
服务端获取cookie
返回值为一个数组,当cookie获取不到时,返回null
1. Cookie[] cookies = req.getCookies(); 2. if (cookies != null) { 3. for (Cookie cookie : cookies) { 4. String name = cookie.getName(); 5. String value = cookie.getValue(); 6. System.out.println(name+"--"+value); 7. } 8. }
面试题
cookie和session的区别
1.Session的定义:
Session对象是存储在服务器端的,主要用来存储用户会话所需的属性数据和配置数据。SessionlD需要存储在浏览器端,浏览器发送接口请求的时候需要带着这个SessionlD。
2.Cookie的定义:
Cookie是一小段存储在浏览器端的文本数据,大小不超过4KB。
某些网站采用Session机制识别用户的身份,通常也会将SessionlD存储在Cookie中。发送网络请求的时候,Cookie会在请求头里一起发送给服务器端。
为什么需要cookie和session?
Cookie 和 Session 是用来在客户端和服务器之间存储和维护状态信息的两种不同技术。
Cookie 是客户端存储的一小块数据,它会在客户端和服务器之间来回传递。Cookie 会被存储在浏览器的文件系统里,并且在浏览器发送请求的时候会自动携带这些数据。
Session 是在服务器端存储的一小块数据,它可以用来跟踪用户的状态。Session 数据存储在服务器端,并且由服务器端来维护。 客户端访问服务器时,服务器会根据客户端的请求来确定客户端的身份,并且为客户端分配一个session ID 。客户端每次请求时都会携带session ID ,服务器通过这个 session ID 来识别客户端并获取相应的 session 数据。
详述 session 工作原理?
Session 是一种在 Web 应用程序中跟踪用户状态的机制。当用户访问 Web 应用程序时,服务器会为该用户创建一个唯一的会话 ID,并将该 ID 存储在用户的浏览器中的 cookie 中。在用户与应用程序交互时,服务器会使用该会话 ID 来识别用户,并在服务器端存储与该用户相关的信息。这些信息可以包括用户的登录状态、购物车内容、浏览历史等。通过使用 session,Web 应用程序可以实现更高级的功能,如用户身份验证、数据持久化等。
为什么说session 比cookie更安全?
Cookie 是一种在用户计算机上存储数据的机制。Web 应用程序可以使用 Cookie 存储用户信息,例如用户 ID、偏好设置和购物车内容等。但是,Cookie 存储在用户计算机上,而且可以在客户端上被访问和修改,这使得 Cookie 更容易受到攻击和伪造,从而使其成为安全威胁。
相比之下,Session 机制将数据存储在服务器端,并且仅在用户与 Web 应用程序交互时将其发送到客户端。用户无法访问或修改存储在服务器上的 Session 数据,这使得 Session 比 Cookie 更安全。此外,Web 应用程序可以使用 SSL/TLS 加密来保护传输过程中的 Session 数据,从而进一步增强安全性。
总的来说,虽然 Cookie 与 Session 都用于 Web 应用程序中的用户跟踪,但 Session 更安全,因为它将数据存储在服务器端,而不是在用户计算机上存储,从而减少了安全风险。