那些年被误导的 Session

本文解释了为何关闭浏览器后Session依旧存在服务器端的原因。通过详细分析Session的工作机制,包括sessionId的管理和存储方式,揭示了Session生命周期的真实情况。此外,还介绍了如何通过调整cookie设置使浏览器在重启后仍能保持登录状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       一开始我是拒绝的,说什么 session 在浏览器关闭之后还在?开玩笑那我岂不是一直都被教错而且还理解错了?

       好吧,事实就是这样,浏览器关闭销毁的是 sessionId,在服务端的 session(只要没超过设置的时间)依然存在,今天就来换个姿势重新认识这个 Session:


为什么关闭浏览器 session 还在?


       浏览器第一次访问服务器时,服务器端会创建一个 session ,然后会将一个 sessionId 返回给浏览器,浏览器会保存这个 sessionId。浏览器在下一次请求时会偷偷地携带上这个 sessionId,然后服务器会把这个 sessionId 和自己内存中存放的 sessionId 进行对比,从而识别区分不同的客户端。当浏览器关闭时,将会清除这个 sessionId,再次打开浏览器访问时由于请求不再携带 sessionId,所以服务器端会再次创建一个 session,并把新的 sessionId 返回给浏览器。。。。(循环)


       说到这里答案已经很明白了,因为服务器没办法知道你是否关闭了浏览器,但是关闭浏览器会清除浏览器存放的 sessionId,从而导致再次打开浏览器访问时需要重新创建 session,所以会给你造成一个假象:"关闭浏览器 session 就被删除了!",但事实是客户端没有 sessionId 和服务器端的 sessionId 匹配了,再者 session 只能同时存在一个,那自然就只能重新再创建一个 session 咯。


什么时候才会删除 session?


       1、session 超时:指的是连续一定时间服务器没有接收到该 session 所对应的客户端的请求,并且这个时间超过了服务器设置的 session 的最大时间

       2、程序调用 HttpSession.invalidate()

       3、服务器关闭或服务停止

       所以别再说什么关闭浏览器 session 就去见上帝了。。。


为什么关闭浏览器会清除 sessionId ?


       首先要明白一件事,sessionId 是以什么形式存放在浏览器的?答案是:cookies

       既然是以 cookies 的形式存放,那就是说可以对它的存活期进行设定,那到底是谁给它的存活期设置成了关闭浏览器就销毁??这里以 Tomcat 创建 会话cookie(我们通常都将关闭浏览器时删除的 cookies 称为 "会话cookie",分不清"会话cookie"和"持久cookie"戳这里http://hhlux.iteye.com/blog/334729) 为例:

org.apache.catalina.connector.Request.java:

protected void configureSessionCookie(Cookie cookie) {  
    cookie.setMaxAge(-1);  
    String contextPath = null;  
    if (!connector.getEmptySessionPath() && (getContext() != null)) {  
        contextPath = getContext().getEncodedPath();  
    }  
    if ((contextPath != null) && (contextPath.length() > 0)) {  
        cookie.setPath(contextPath);  
    } else {  
        cookie.setPath("/");  
    }  
    if (isSecure()) {  
        cookie.setSecure(true);  
    }  
}

       答案就是这行代码:cookie.setMaxAge(-1);  它表示 cookies 在浏览器关闭时被删除。


如何关闭浏览器再打开还能保持登录状态?


       上面已经提到了,sessionId 在客户端是以 cookies 的形式保存的,cookies 在不设置存活期的情况下是关闭浏览器就会删除,所以说你完全可以给它设置一个时间,确保它可以保存在本地一段时间,从而实现关闭浏览器后再打开,请求服务器端时还能记住你的登录状态。

       当然这是建立在你的 session 没过期的前提下的喔。而且肯定也不止这一种方法,别的方法和原理戳这里:http://canann.iteye.com/blog/1687425


       事实证明,学东西还是要多动手啊!!!(多么痛的领悟)

### 解决 `ray.tune` 模块中不存在 `is_session_enabled` 属性的问题 遇到错误提示 `AttributeError: module 'ray.tune' has no attribute 'is_session_enabled'` 表明尝试访问的属性并不存在于当前使用的 Ray 版本中的 `tune` 模块里。 通常情况下,这种类型的错误可能由以下几个原因引起: - 使用了过时或不再支持的方法名。 - 安装的库版本与文档描述不符。 - 文档或代码示例未及时更新以反映API变更。 对于特定提到的 `is_session_enabled` 方法,在官方文档以及社区讨论中并未找到直接对应的实现。这可能是由于 API 的变化或是基于较旧版本的例子造成的误导[^1]。 为了确认具体的情况,建议采取以下措施来排查和解决问题: #### 验证安装版本 确保所使用的 Ray 库是最新的稳定版,可以通过命令行检查已安装包的信息: ```bash pip show ray ``` 如果发现不是最新版本,则可以考虑升级到最新的稳定版本: ```bash pip install --upgrade ray ``` #### 查阅官方文档 查阅 [Ray Tune](https://docs.ray.io/en/latest/tune/index.html) 的官方文档获取最准确的功能说明和支持特性列表。注意查看是否有替代方案可用于满足需求。 #### 替代解决方案 假设目标是在训练过程中控制某些行为(比如启用/禁用会话),可以根据实际应用场景寻找合适的配置选项或者参数设置方式。例如,通过调整实验配置文件、环境变量或者其他形式的接口来进行相应的操作。 #### 社区求助 当无法自行定位问题根源时,向开源项目维护者寻求帮助也是一个有效的途径。可以在 GitHub Issues 页面提交一个问题报告,并提供详细的背景信息以便他人更好地理解情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值