我的理解:

简单来说,要使用服务器端的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

https://blog.csdn.net/u013210620/article/details/52318884

对JSP中的Session 简单理解的更多相关文章

  1. ECshop中的session机制理解

    ECshop中的session机制理解     在网上找了发现都是来之一人之手,也没有用自己的话去解释,这里我就抛砖引玉,发表一下自己的意见,还希望能得到各界人士的指导批评! 此session机制不需 ...

  2. jsp中的session和上下文

    Session的典型应用: 防止用户非法登录到某个页面. 网上商城的购物车 保存用户登录信息 注:多个请求要用的东西放在session中,多个会话之间要用的东西放在上下文中. 如何创建session? ...

  3. Jsp中解决session过期跳转到登陆页面并跳出iframe框架的方法

    1.可以用javaScript解决在你想控制跳转的页面,比如login.jsp中的<head>与</head>之间加入以下代码: <script language=”Ja ...

  4. 对Django框架中Cookie的简单理解

    概念的理解:首先Cookie和Session一样,是django中用于视图保持状态的方案之一.为什么要进行视图保留呢,这是因为浏览器在向服务器发出请求时,服务器不会像人一样,有记忆,服务器像鱼一样,在 ...

  5. 对C#中事件的简单理解

    对于C#中的事件,我举了个简单的例子来理解事件及其处理. 这个例子中母亲是事件的发布者,事件是吃饭了.儿子和父亲是事件的订阅者,各自的Eat方法是处理事件的方法. 下面是详细的加注的例子: using ...

  6. java中volatile的简单理解

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/7833881.html 据说,volatile是java语言中最轻量级的并发控制方式. vo ...

  7. PHP中的traits简单理解

    Traits可以理解为一组能被不同的类都能调用到的方法集合,但Traits不是类!不能被实例化.先来例子看下语法: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 1 ...

  8. jsp中的session

    浏览器和服务器的异常通话 常用方法 setAttribute(String key,Object value);//设置值 getAttribute(String key); //取值 Invalid ...

  9. JSP中解决session超时跳转到登陆页面并跳出iframe框架或局部区域的方法

    当session会话超时,页面请求被重新定位到了登陆界面.但登录界面在iframe中的解决方案:在登录页面中加入下面的js代码: <script type="text/javascri ...

随机推荐

  1. 手机端h5页面 图片根据手势放大缩小

    pinchzoom.js 这个插件可以简单的实现这一功能 <div class="big_pos_img page"> <div class="pinc ...

  2. Linux 使用 split 命令分割文件

    使用方法: $ split --help 用法:split [选项]... [输入 [前缀]] 将输入内容拆分为固定大小的片段并输出到"前缀aa"."前缀ab" ...

  3. 初识python: xml 操作

    导入模块: import xml.etree.ElementTree as ET 创建xml文件: new_xml = ET.Element("namelist") # 创建根节点 ...

  4. elasticsearch设置密码

    ELK - X-Pack设置用户密码 enable X-Pack security vi elasticsearch.yml #首先开启x-pack插件 xpack.security.enabled: ...

  5. win11系统设置笔记本合盖上不休眠

    第一步.打开控制面板 第二步.打开控制面板 第三步.打开电源选项 第四步.如下图操作即可

  6. 基于LNMP环境的Zabbix监控安装

    一.准备LNMP环境 1.使用putty或类似的SSH工具登陆VPS或服务器: 登陆后运行:screen -S lnmp 如果提示screen: command not found 命令不存在可以执行 ...

  7. Linux上天之路(九)之文件和文件夹的权限

    主要内容 linux 基本权限 linux特殊权限 linux隐藏权限 linux file ACL 权限 1. Linux的基本权限 使用ls -l filename 命令查看文件或文件夹详细权限 ...

  8. PPT文档学习小练习链接

    1. <初识PPT2010> https://www.toutiao.com/i6486689592241029645/ 2. <PowerPoint2010实现折线图动态展示> ...

  9. layui 时间插件,change&&done,按照官网写法无效,解决方式!

    摘抄自 hahei2020:https://blog.csdn.net/hahei2020/article/details/79285370 layui 时间插件, 当选择时间或时间发生改变后,按照官 ...

  10. PAT 乙级 1001. 害死人不偿命的(3n+1)猜想 (15)(C语言描述)

    卡拉兹(Callatz)猜想: 对任何一个自然数n,如果它是偶数,那么把它砍掉一半:如果它是奇数,那么把(3n+1)砍掉一半.这样一直反复砍下去,最后一定在某一步得到n=1.卡拉兹在1950年的世界数 ...