Java Web 状态管理(下) Session基础

Session 基础

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,并打印里面的信息

java 复制代码
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{
    @Override
    protected 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);

    }

    @Override
    protected 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需要额外的服务器端存储和验证逻辑,因此在处理大量请求时可能会增加服务器的负载。

相关推荐
Swift社区1 小时前
在 Swift 中实现字符串分割问题:以字典中的单词构造句子
开发语言·ios·swift
没头脑的ht1 小时前
Swift内存访问冲突
开发语言·ios·swift
没头脑的ht1 小时前
Swift闭包的本质
开发语言·ios·swift
wjs20241 小时前
Swift 数组
开发语言
xiaoyalian1 小时前
R语言绘图过程中遇到图例的图块中出现字符“a“的解决方法
笔记·r语言·数据可视化
吾日三省吾码2 小时前
JVM 性能调优
java
stm 学习ing2 小时前
FPGA 第十讲 避免latch的产生
c语言·开发语言·单片机·嵌入式硬件·fpga开发·fpga
湫ccc3 小时前
《Python基础》之字符串格式化输出
开发语言·python
弗拉唐3 小时前
springBoot,mp,ssm整合案例
java·spring boot·mybatis
Red Red3 小时前
网安基础知识|IDS入侵检测系统|IPS入侵防御系统|堡垒机|VPN|EDR|CC防御|云安全-VDC/VPC|安全服务
网络·笔记·学习·安全·web安全