Session 基础

  • session是什么
  • session的作用(也就第一个比较说人话点)
  • session的实现原理
  • 注意
  • 从而得之
  • session原理的小demo
  • 总结

session是什么

session是一种储存在服务端的对象,里面的内容通常也是以键值对(key-value)的形式存在。

session的作用(也就第一个比较说人话点)

用户身份验证和管理:
Session在用户登录后可以保存用户的身份信息,标识用户的身份,以便后续的请求可以识别用户并进行相应的权限控制。通过Session,服务端可以判断用户是否已经登录,并根据用户的身份做出不同的处理。

数据共享:
Session保存在服务端,可以跨请求共享数据。当用户发送一个请求到服务器时,服务器可以根据Session的标识找到对应的Session,获取Session中存储的数据为用户服务。

提高数据处理的效率:
当需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的Session中。当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据为用户服务。

session的实现原理

session通常是依赖cookie为基础进行实现的,听说也能以URL重写去实现,但我没有具体了解过

当用户首次访问Web应用时,Web应用会在服务器里存储一个session对象,并自动生成一个唯一的Session ID,并将这个Session ID以Cookie的形式返回给浏览器。浏览器会将这个Cookie保存起来。

当用户再次访问Web应用中的页面时,浏览器会自动将存储的Cookie发送给服务器。服务器接收到请求后,通过反序列化Session ID来查找对应的Session对象。

服务器数量远远小于客户端数量,一个服务器往往需要存储一大批的session对象,session ID的出现是让服务器能够轻松地找到对应客户端的session ID

如果找到了对应的Session,服务器端就可以根据Session中保存的数据来处理请求。如果没有找到对应的Session(session ID过期失效,或者服务器崩溃重启等特殊情况),服务器端可能会创建新的Session。

当Session中的数据发生变化时,服务器端会将这些数据持久化,确保用户刷新页面或打开新窗口时数据不会丢失。

注意

当用户关闭浏览器时,Session或者Session ID并不会立即被销毁。实际上,Session的销毁取决于配置的Session超时(过期)时间。如果用户在一段时间内没有活动,Session会被标记为非活动状态,等待超时时间结束后,Session才会被销毁。因此,关闭浏览器并不一定意味着会话结束,而是取决于配置的Session超时时间。

从而得之

会话控制中的会话是指客户端和服务端的一系列交互和信息传递,那么会话结束到底是什么时候也与服务端的设置有关,假如服务端设置过期时间为30分钟,那么客户端和服务端在30分钟内无交互,这个会话也结束了,那假如设置过期时间为3天,那么即使客户端一天都没去该网站访问,但会话还是没有结束。

session原理的小demo

测试主要代码

访问后并不会与任何前端界面联动,只是单纯地生成一个session,并打印里面的信息

import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;import java.io.IOException;@WebServlet("/session_demo")public class SessionDemo extends HttpServlet{@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 获取当前会话对象HttpSession session = req.getSession();// 设置Session的过期时间为1小时session.setMaxInactiveInterval(60*60);//如果一个小时,该客户端没有与服务器进行任何交互,那么服务器会自动删除该session对象// 向会话中添加属性session.setAttribute("username", "tony");session.setAttribute("password", 8888);// 从会话中获取属性String username = (String) session.getAttribute("username");int password = (Integer) session.getAttribute("password");System.out.println("用户名和密码是:");System.out.println(username+password);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {super.doPost(req, resp);}}

然后我们进入浏览器抓包查看

首次访问的set-cookie形式,将sessionID存储在浏览器中

第二次访问该界面时,则是请求头嵌入该cookie在服务器里找对应的session对象

总结

Cookie和session已经算一个比较偏底层的基础知识了,之后我可能更多用的还是JWT吧,当然这也取决于具体的应用场景,我们可以适当了解一下它们的缺点,主要是安全性和服务器负载程度的区别。

Cookie:
Cookie通常用于存储用户信息,如登录状态、购物车信息等。由于Cookie存储在客户端浏览器中,因此它可以跨多个请求持久化用户数据。然而,由于Cookie的存储容量有限,并且容易受到跨站脚本攻击(XSS)的影响,因此在使用Cookie时需要谨慎处理。

Session:
Session也是一种常用的会话管理技术,它通过在服务器端存储用户信息来跟踪用户的活动状态。Session通常用于处理用户登录、表单提交等场景。由于Session将数据存储在服务器端,因此可以存储大量数据,并且能够保证数据的机密性和安全性。然而,Session需要服务器端进行额外的存储和管理,因此在处理大量请求时可能会增加服务器的负载。

JWT:
JWT(JSON Web Token)是一种基于Token的认证机制,它常用于API之间的安全通信。JWT可以用于在客户端和服务器之间传递用户身份验证信息和其他数据。由于JWT是基于Token的认证机制,因此它可以跨多个请求传递用户数据,并且能够实现跨域认证。此外,JWT具有较好的安全性,因为它可以包含加密签名以验证数据的完整性和真实性。然而,JWT需要额外的服务器端存储和验证逻辑,因此在处理大量请求时可能会增加服务器的负载。