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

相关推荐
Chrikk1 分钟前
Go-性能调优实战案例
开发语言·后端·golang
亦枫Leonlew2 分钟前
三维测量与建模笔记 - 3.3 张正友标定法
笔记·相机标定·三维重建·张正友标定法
幼儿园老大*4 分钟前
Go的环境搭建以及GoLand安装教程
开发语言·经验分享·后端·golang·go
canyuemanyue4 分钟前
go语言连续监控事件并回调处理
开发语言·后端·golang
考试宝5 分钟前
国家宠物美容师职业技能等级评价(高级)理论考试题
经验分享·笔记·职场和发展·学习方法·业界资讯·宠物
杜杜的man6 分钟前
【go从零单排】go语言中的指针
开发语言·后端·golang
测开小菜鸟8 分钟前
使用python向钉钉群聊发送消息
java·python·钉钉
P.H. Infinity1 小时前
【RabbitMQ】04-发送者可靠性
java·rabbitmq·java-rabbitmq
生命几十年3万天1 小时前
java的threadlocal为何内存泄漏
java
caridle1 小时前
教程:使用 InterBase Express 访问数据库(五):TIBTransaction
java·数据库·express