session里保存什么信息

本文介绍了HTTP协议的无状态特性以及为保持用户信息而引入的Cookie和Session技术。Session主要用于存储用户身份、登录状态、个性化配置和权限等信息,但不应存储敏感数据如密码。由于SessionID通常通过Cookie在客户端和服务端之间传递,关闭浏览器不会删除服务器上的Session,但可能删除Cookie。分布式环境下常使用Redis来模拟Session。文章通过医院就医卡的例子形象地解释了Session的工作原理,并提醒了Session实现的'记住我'功能的安全隐患。最后,提到了Token的安全性优势以及其在防止CSRF攻击中的作用。

http本身无状态,说白了就是不保存任何用户信息。 所以引入cookie(客户端方案)、session(服务端方案)来保存用户信息:

这些信息通常包括什么,不能包括什么呢?

: 1. 身份信息、登陆状态 2. 用户的个性配置、权限列表 3. 其他的一些通用数据(比如购物车)4 登录凭证, 权限 ?

: session不适合保存比较多的信息,防止服务端压力过大。

: 一般只存ID

: 密码不宜放进session。 private transient String password; 且分布式项目的缘故。

session相关信息:

1 失效只能是超时或者invalidate(); 关闭浏览器不会删除服务端的session,但是可能会删除cookie保存 的sessionId。

2 session实现的‘记住我’并不安全。https://coolshell.cn/articles/5353.html。 记住我相当于自动查数据库。

至于token为什么比sessionId安全,CSRF攻击的方式:被骗去点了个链接,被恶意的JS提交的等

3 一般都是用redis模拟session。

例子

当我们去医院就诊时,医院都会给就诊病人发放就医卡,卡上只有卡号,而没有其它信息。但病人每次去该医院就诊时,只要出示就医卡,医务人员便可根据卡号查询到病人的就诊信息。Session技术就好比医院发放给病人的就医卡和医院为每个病人保留病例档案的过程。当浏览器访问Web服务器时,Servlet容器就会创建一个Session对象和ID属性,其中,Session对象就相当于病历档案,ID就相当于就医卡号。当客户端后续访问服务器时,只要将标识号传递给服务器,服务器就能判断出该请求是哪个客户端发送的,从而选择与之对应的Session对象为其服务。

需要注意的是,由于客户端需要接收、记录和回送Session对象的ID,因此,通常情况下,Session是借助Cookie技术来传递ID属性的。

为了大家更好的理解Session,接下来,以网站购物为例,通过一张图来描述Session保存用户信息的原理,具体如图1所示。

在这里插入图片描述
在图1中,用户甲和乙都调用buyServlet将商品添加到购物车,调用payServlet进行商品结算。由于甲和乙购买商品的过程类似,在此,以用户甲为例进行详细说明。当用户甲访问购物网站时,服务器为甲创建了一个Session对象(相当于购物车)。当甲将Nokia手机添加到购物车时,Nokia手机的信息便存放到了Session对象中。同时,服务器将Session对象的ID属性以Cookie (Set-Cookie: JsessionID=111)的形式返回给甲的浏览器。当甲完成购物进行结账时,需要向服务器发送结账请求,这时,浏览器自动在请求消息头中将Cookie (Cookie: JsessionID=111)信息回送给服务器,服务器根据ID属性找到为用户甲所创建的Session对象,并将Session对象中所存放的Nokia手机信息取出进行结算。

<think>好的,用户想了解如何使用session保存登录信息,特别是示例代码。我需要先回顾一下session的基本原理,确保自己理解正确。根据引用[2],session的数据是储在服务器端的,客户端只保存session ID在cookie中。这样关闭浏览器不会立即清除session,只有超时或手动销毁才会。 接下来,用户需要具体的实现步骤和示例代码。可能需要分语言来说明,但用户问题中没有指定语言,但示例可能希望看到常见的如PHP、Java或Python等。不过引用中提到了PHP、JavaWeb的例子,所以可能需要涵盖这些。 首先,应该解释session保存登录状态的一般流程:用户登录验证成功,将用户信息session,之后每个请求通过检查session是否在用户信息来判断是否登录。同时,要考虑安全性,比如session过期时间、使用HTTPS等。 然后分语言给出示例。比如PHP中,启动session,验证用户后设置$_SESSION变量。Java的话,使用HttpSession对象。Python的Flask框架使用session对象。需要注意不同语言的语法差异。 还要考虑用户可能遇到的问题,比如session失效的处理,如何防止session劫持等安全措施。引用[3]提到会话消失才会清除session,所以需要设置合适的超时时间。 最后,生成相关问题,帮助用户深入理解,比如安全措施、多设备登录处理、session储位置等。确保回答结构清晰,步骤明确,代码正确,并且引用相关的参考资料来支持。</think>### 如何用 Session 保存用户登录状态? #### 1. Session 的基本原理 Session 是一种服务器端的会话管理机制,通过以下步骤实现状态保存: - 用户登录时,服务器创建唯一 Session ID 并返回给客户端(通常通过 Cookie) - 服务器将用户登录信息储在内或持久化储中(如数据库、Redis)[^2] - 后续请求通过 Session ID 验证用户身份 - 会话终止条件:主动销毁或超时(关闭浏览器不会立即清除 Session)[^3] --- #### 2. 实现步骤与示例代码 ##### PHP 示例 ```php // 启动 Session session_start(); // 用户登录验证 if ($_POST['username'] == 'admin' && $_POST['password'] == '123456') { $_SESSION['user'] = [ 'id' => 1, 'username' => 'admin', 'login_time' => time() ]; echo "登录成功"; } // 检查登录状态 function check_login() { if (!isset($_SESSION['user'])) { header("Location: login.php"); exit(); } } ``` ##### Java Servlet 示例 ```java // 用户登录处理 HttpSession session = request.getSession(true); if ("admin".equals(username) && "123456".equals(password)) { session.setAttribute("user", new User(1, "admin")); response.sendRedirect("dashboard.jsp"); } // 登录状态检查 User user = (User) session.getAttribute("user"); if (user == null) { response.sendRedirect("login.jsp"); } ``` ##### Python Flask 示例 ```python from flask import session @app.route('/login', methods=['POST']) def login(): if request.form['username'] == 'admin' and request.form['password'] == '123456': session['user'] = {'id': 1, 'username': 'admin'} return redirect(url_for('dashboard')) @app.before_request def check_login(): if 'user' not in session and request.endpoint != 'login': return redirect(url_for('login')) ``` --- #### 3. 关键配置与安全建议 1. **Session 有效期设置** - PHP:`session.gc_maxlifetime = 1440`(默认24分钟) - Java:`<session-config><session-timeout>30</session-timeout></session-config>` 2. **安全增强措施** - 使用 HTTPS 传输 Cookie - 设置 Cookie 的 Secure 和 HttpOnly 属性 - 定期更换 Session ID(会话固定防护) 3. **储优化** - 使用 Redis 或数据库持久化Session[^2] - 分布式系统需共享 Session 储 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值