对JSP中的Session 简单理解
我的理解:
简单来说,要使用服务器端的session对象,就是要有其对应的key,即sessionid,它只认识sessionid。
下面我说的cookie,url重写或者隐藏表单,都是为了将其对应的key,即sessionid,一起与请求发送到服务器。
另外,cookie与session都是用来标识用户的手段,cookie将用户的一些信息存储在客户端,而session是将用户信息保存在服务器端的,JSP的默认是保存在服务器端内存中(各种语言的不太一样),服务器重启便会都清空了,而且session对象自己也有有效时间,当然也可以将session持久化存储在服务器硬盘等地方。
下面的使用cookie的情况只是借用了cookie的手段来更方便的使用seesion。
当用户请求访问动态JSP页面时
- 如果在请求头中有cookie信息(含有jsessionid),那么JSP容器便会查找是否有与其jsessionid匹配的session(默认存在于服务器内存中),如果没有则创建(前提是request.getsession(true),JSP默认为true)
- 如果请求头中没有cookie信息,那么JSP容器发给浏览器响应时,会在响应头信息中含有set-cookie信息(比如:Set-Cookie: JSESSIONID=12B65264540AC4B023CDEF11C08F2B12; Path=/SignInTest/; HttpOnly),如果浏览器没有禁用cookie,则浏览器会保存此含有jseesionid值得cookie,cookie的保存位置按cookie得类型决定,如果cookie没有设置有效时间,则默认为 会话cookie(保存在浏览器进程内存中,关闭浏览器便会被清除),如果cookie设置了有效时间,则为 持续cookie(保存在浏览器自己规定的硬盘文件中,只要cookie在有效时间内,重新打开浏览器也不会清除)。
注:cookie的有效时间并不和session的有效时间同步,他们两个匹配只靠cookie中保存的sessionid,如果是会话cookie,即便浏览器关闭后,服务器端的seesion也不一定会被释放内存,除非session的到了seesion的存在时间,或者被调用了其invalidate方法解绑,再或者服务器重启。同理,即便cookie还有效,服务器端的session也可能因为以上某种原因销毁,当浏览器再次使用此还有效的cookie请求时,便会重复上面我说的当浏览器有cookie,而服务器没有其对应的session对象时。
注:Jsessionid只是tomcat的对sessionid的叫法,其实就是sessionid;在其它的容器也许就不叫jsessionid了。
另外,这种session的使用方法需要依赖cookie,如果浏览器被禁用了cookie就不可用了,即浏览器不会保存响应头信息中的set-cookie。
一般的解决方法有:
- 重写URL(所有含有请求链接的页面都必须为动态生成)
- 隐藏表单(所有含有隐藏表单的页面都必须为动态生成)
request.encodeURL(String url);
注意:此方法会自动检测浏览器是否禁用cookie,如果没有禁用,则将url原封不动的输出,反之拼接jsessionid的值。
response.encodeURL(string url);
注意HttpServletRequest的两个方法,jsp既是默认为true,创建session。

Cookie持久化
发现在JSP响应头信息中的cookie都没有设置有效时间,及默认为会话cookie(保存在浏览器进程内存中),所以我想给他设置有效时间,使其持久化,可以保存在硬盘,重启浏览器后已经有效。
//Cookie持久化
Cookie jsessionid=new Cookie("JSESSIONID",session.getId());
jsessionid.setPath("/项目名称路径/");
jsessionid.setMaxAge(900);//单位秒,如果要删除cookie,则设置该方法参数为0.
response.addCookie(jsessionid);
最好判断一下,不要每次都响应cookie信息。
参考:
https://www.runoob.com/jsp/jsp-session.html
https://blog.csdn.net/weixin_42217767/article/details/92760353
https://blog.csdn.net/u012554102/article/details/49454797
https://blog.csdn.net/dlovejava/article/details/80863855
https://www.cnblogs.com/ym77/p/11323742.html
https://blog.csdn.net/dlovejava/article/details/80863855
https://blog.csdn.net/hgx_suiyuesusu/article/details/77678365?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
对JSP中的Session 简单理解的更多相关文章
- ECshop中的session机制理解
ECshop中的session机制理解 在网上找了发现都是来之一人之手,也没有用自己的话去解释,这里我就抛砖引玉,发表一下自己的意见,还希望能得到各界人士的指导批评! 此session机制不需 ...
- jsp中的session和上下文
Session的典型应用: 防止用户非法登录到某个页面. 网上商城的购物车 保存用户登录信息 注:多个请求要用的东西放在session中,多个会话之间要用的东西放在上下文中. 如何创建session? ...
- Jsp中解决session过期跳转到登陆页面并跳出iframe框架的方法
1.可以用javaScript解决在你想控制跳转的页面,比如login.jsp中的<head>与</head>之间加入以下代码: <script language=”Ja ...
- 对Django框架中Cookie的简单理解
概念的理解:首先Cookie和Session一样,是django中用于视图保持状态的方案之一.为什么要进行视图保留呢,这是因为浏览器在向服务器发出请求时,服务器不会像人一样,有记忆,服务器像鱼一样,在 ...
- 对C#中事件的简单理解
对于C#中的事件,我举了个简单的例子来理解事件及其处理. 这个例子中母亲是事件的发布者,事件是吃饭了.儿子和父亲是事件的订阅者,各自的Eat方法是处理事件的方法. 下面是详细的加注的例子: using ...
- java中volatile的简单理解
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/7833881.html 据说,volatile是java语言中最轻量级的并发控制方式. vo ...
- PHP中的traits简单理解
Traits可以理解为一组能被不同的类都能调用到的方法集合,但Traits不是类!不能被实例化.先来例子看下语法: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 1 ...
- jsp中的session
浏览器和服务器的异常通话 常用方法 setAttribute(String key,Object value);//设置值 getAttribute(String key); //取值 Invalid ...
- JSP中解决session超时跳转到登陆页面并跳出iframe框架或局部区域的方法
当session会话超时,页面请求被重新定位到了登陆界面.但登录界面在iframe中的解决方案:在登录页面中加入下面的js代码: <script type="text/javascri ...
随机推荐
- [数据结果]C语言 基础指令汇编
数据结构 C语言核心操作集合 (1)预定义常量和类型 //函数结果状态代码 #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #d ...
- CS5268替代AG9321MCQ 替代AG9321方案 TYPEC转HDMI多功能拓展坞
台湾安格AG9321MCQ是一款TYPEC拓展坞产品方案,他集中了TYPEC 转HDMI VGA PD3.0快充 QC3.0数据传输 I2S接口的音频DAC输出以及可以各种读卡器功能. Caps ...
- SpringBoot集成MyBatis-Plus框架详细方法
1.说明 本文详细介绍Spring Boot集成MyBatis-Plus框架的方法, 使用MySQL数据库进行测试, 包括完整的开发到测试步骤, 从一开始的Spring Boot工程创建, 到MySQ ...
- Maven常用参数说明
缩写 全名 说明 -h --help 显示帮助信息 -am --also-make 构建指定模块,同时构建指定模块依赖的其他模块 -amd --also-make-dependents 构建指定模块, ...
- 单元测试 报错 org.junit.runners.model.InvalidTestClassError: Invalid test class 'com.example.xxx' 解决
1.前言 很奇怪 ,单元测试正常执行,但是结束后会报错 org.junit.runners.model.InvalidTestClassError: Invalid test class 'com.e ...
- 用户注册调优 及Connection对象
调优的方法: (1)减少Connection对象的销毁与创建 我们可以在服务器启动时 预先创建好二十个Connection对象 因为每次Coonection对象的创建与销毁会浪费大量的时间 我们需要 ...
- Kube-OVN 1.2.0发布,携手社区成员打造高性能容器网络
Kube-OVN 1.2.0 新版本如期而至,支持 Vlan 和 OVS-DPDK 两种类型的高性能网络接口.本次发布得益于社区的壮大,感谢Intel爱尔兰开发团队与锐捷网络开发团队持续积极参与Kub ...
- kafka时间轮的原理(一)
概述 早就想写关于kafka时间轮的随笔了,奈何时间不够,技术感觉理解不到位,现在把我之前学习到的进行整理一下,以便于以后并不会忘却.kafka时间轮是一个时间延时调度的工具,学习它可以掌握更加灵活先 ...
- day23 结构体
(1).若有说明和定义: typedef int *integer: integer p,*q: 则下列叙述正确的是[C] (A).q是基类型位int的指针变量 (B).p是int型变量 (C).p是 ...
- 以太 ip tcp udp 三次握手的理解
以太帧: 1.前导码(7字节):使接收器建立比特同步. 2.起始定界符SFD(1字节):指示一帧的开始. 3.目的地址DA(6字节):指出要接收该帧的工作站. 4.源地址SA(6字节):指示发送该帧的 ...