我的理解:

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

    Algorithm 本周的 LeetCode 题目为 5. 最长回文子串 给你一个字符串 s,找到 s 中最长的回文子串.例如输入:s = "babad",输出:"bab ...

  2. 使用 JavaScript 根据消费金额和消费者是否为会员确定折扣,最终核算实际应该支付的金额

    查看本章节 查看作业目录 需求说明: 根据消费金额和消费者是否为会员确定折扣,最终核算实际应该支付的金额 消费金额在 200 元以上的会员折扣是 7.5 折,消费金额没有达到 200 元的会员折扣是 ...

  3. Linux查看CPU详细信息

    1.查看CPU详细信息 在Linux服务器上查看CPU详细信息: cat /proc/cpuinfo 输出结果: processor : 0 vendor_id : GenuineIntel cpu ...

  4. 图像数据到网格数据-1——Marching Cubes算法的一种实现

    概述 之前的博文已经完整的介绍了三维图像数据和三角形网格数据.在实际应用中,利用遥感硬件或者各种探测仪器,可以获得表征现实世界中物体的三维图像.比如利用CT机扫描人体得到人体断层扫描图像,就是一个表征 ...

  5. 使用.NET 6开发TodoList应用(19)——处理OPTION和HEAD请求

    系列导航及源代码 使用.NET 6开发TodoList应用文章索引 需求 在HTTP请求中,我们还剩下两类不常使用的请求没有讲到,本文就来实现以下关于OPTIONS和HEAD请求.OPTIONS请求用 ...

  6. mysql+heartbeat+drbd安装

    环境: 系统           IP地址            主机名             软件包列表 centos6.5  192.168.200.101      server1       ...

  7. Vue养成之路

    目录 Vue系列教程(一)之初识Vue Vue系列教程(二)之Vue进阶 Vue系列继承(三)之Vue-cli脚手架的使用 ... 更新中 基础入门 Vue基础(一)之es6 Vue基础(二)之箭头函 ...

  8. mysql按照时间分组查询

    mysql 按年.月.周.日分组查询 1.按照年份分组查询 SELECT DATE_FORMAT(t.bill_time,'%Y') month_time,sum(t.pay_price) total ...

  9. class、抽象类、接口区别

    Java 抽象类 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类. 由于抽象类不 ...

  10. AVD模拟器怎么配置上网

    转自:http://blog.csdn.net/you_jinjin/article/details/7228303 方法一 首先,Windows下,配置Adroid环境变量(Win7为例) 1.桌面 ...