对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 ...
随机推荐
- JWT+SpringBoot实战
往期内容:JWT - 炒焖煎糖板栗 - 博客园 (cnblogs.com) JWT可以理解为一个加密的字符串,里面由三部分组成:头部(Header).负载(Payload).签名(signature) ...
- TypeScript中文教程基础部分上----翻译自TS官方
为什么使用TS? js中每一个值在不同的操作运行中表现出一系列不同的行为,比如说下面这个例子: message.toLowerCase();message(); 逐行看下,第一行调用了message的 ...
- pytest用例的执行顺序
Pytest执行的顺序 当pytest运行测试函数时,它会查看该测试函数中的参数,然后搜索与这些参数具有相同名称的fixture.一旦pytest找到这些对象,它就会运行这些fixture 影响执行顺 ...
- Nginx_全局命令设置
刚安装好的Nginx, 命令需要去sbin目录执行,比较麻烦,设置下全局命令,就无需进入nginx的sbin目录执行nginx命令了 1.创建文件 vim /etc/init.d/nginx 把下面代 ...
- Centos7 mysqldump定时任务,对mysql定时备份数据
vi mysqldump_bak.sh #!/bin/bash PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/ ...
- win10 防火墙配置 允许局域网其他设备访问本地工程
1.进入防护墙并找到高级设置 2.选择属性 3.将入站连接设为允许,有三个别忘了,[域配置文件,专用配置文件,公用配置文件]
- 解决MySQL服务器禁止远程连接的问题
1. 改表法. 可能是你的帐号不允许从远程登陆,只能在localhost.这个时候只要在localhost的那台电脑,登入mysql后,更改 "mysql" 数据库里的 " ...
- Vue系列教程(二)之Vue进阶
一.Vue对象的操作 1. 可以通过一个Vue对象操作另一个Vue对象 var v1 = new Vue({ el: "#app1", data: {title:"hel ...
- js对象数组多字段排序
来源:js对象数组按照多个字段进行排序 一.数组排序 Array.sort()方法可以传入一个函数作为参数,然后依据该函数的逻辑,进行数组的排序. 一般用法:(数组元素从小大进行排序) var a = ...
- JAVA-JDK1.7-ConCurrentHashMap-测试和验证
概述 上次记录了关于ConCurrentHashMap的原理以及源码,现在我对其进行有关功能的测试,下面就讲解一下我测试的内容和代码.这些测试主要针对JDK1.7版本. GET安全测试 上一篇写过ge ...