HttpSession的工作原理及相关常见问题

以下以session简称:
1、session的生命周期:session是在服务器第一次执行getSession()语句时才创建的(此方法:服务器先从浏览器带来的cookie中查找JSESSIONID,是否有相关可用的session,有就调用,如果没有,再从超链接的URL中查找
JSESSIONID,如果还没有,就会创建一个新的session。),如果session对象30分钟内没有被访问,服务器将自动销毁该session.
另外,
可以通过web.xml文件配置session的失效时间,单位为分钟

<seesion-config>
    <session-timeout>10</session-timeout>
</seesion-config>

可以通过session.invalidate()方法来销毁session对象。

2、session的创建是基于cookie的,服务器在新创建session的时候,会自动为session设置一个ID信息,并以cookie的形式回写给浏览器,JSESSIONID=IDNumber,IDNumber是服务器自动生成的唯一的编码;当浏览器访问别的页面的时候,自动会带着该cookie信息,这样服务器会自动调用已生成的session,而不会重新创建session对象,或调用错误的session

3、服务器创建session对象时,生成的cookie是没有指定生存时间的,所以当浏览器意外关闭的时候,相应的cookie会随之销毁,这样用户再次访问相应的页面时,上次保存的session对象也就找不到了,服务器会再次创建一个新的session对象。这种情况会造成:用户在浏览器意外关闭前,所有保存在session中的操作信息也随之丢失。    
    这样用户体验会相当不好,为了避免出现这种情况,我们需要将保存session对象ID信息的cookie设置一个生存时间,这样浏览器意外关闭的时候,cookie不会随之销毁,这样就保证了,用户在浏览器意外关闭后再次访问页面时,可以继续之前的相应操作。
方法:
1、先获取服务器新创建的session的ID
2、实例化一个与服务器回写给浏览器一样的cookie,以保存此ID信息
3、指定cookie可见的目录,要与服务器默认的相同,默认为相应的web应用
4、设置cookie的生存时间(最好是30分钟以内)
5、将此cookie回写给浏览器
实现代码:

HttpSession session = request.getSession();
String sessionid = session.getId();
Cookie cookie = new Cookie("JSESSIONID", sessionid);
cookie.setPath("path");
cookie.setMaxAge(30*60);
response.addCookie(cookie);

4、我们知道了session对象是基于cookie的,如果用户使用的浏览器把cookie禁用了,那么session将会失效。
解决此类问题的方法是:使用URL重写,即将所有涉及到的URL信息中加入session的ID属性JSESSIONID。

实现代码:
String newURL = response.encodeURL("odlURL")
对odlURL进行重写,返回的newURL中包含了session的ID值。
newURL的形式是:
如果odlURL中带有参数,则在?前加上
;JSESSIONID=IDNumber     
格式为:——;JSESSIONID=IDNumber?——
如果oldURL中没有参数,则直接是oldURL;
JSESSIONID=IDNumber

encodeURL(String url)方法的一个实现细节:该方法执行的时候,服务器会判断浏览器是否带有JSESSIONID相关的cookie,如果有就不会再进行URL重写,如果没有就会进行URL重写。
    我们知道该方法是为了解决那些禁用或不支持cookie的浏览器出现的相关问题。那么对于支持cookie而且没有禁用cookie的情况下,我们仍使用URL重写的时候,会出现的情况:第一次访问的时候浏览器是没有带着JSESSIONID的相关cookie的,所以会进行URL重写,在此同时服务器把session的相关cookie信息回写给了浏览器,第二次再访问的时候浏览器带有
JSESSIONID的相关cookie,所以就不会再进行URL重写了。

注:对于那些禁用或不支持cookie的浏览器,通过URL重写后,当浏览器意外关闭面出现的session丢失的问题,是无法解决的!!!

对于健壮的会话跟踪,servlet 发出的所有 URL 都应该通过此方法运行。否则,session不能用于不支持 cookie 的浏览器。

时间: 2024-10-26 20:12:14

HttpSession的工作原理及相关常见问题的相关文章

【Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之RAC 工作原理和相关组件(三)

RAC 工作原理和相关组件(三) 概述:写下本文档的初衷和动力,来源于上篇的<oracle基本操作手册>.oracle基本操作手册是作者研一假期对oracle基础知识学习的汇总.然后形成体系的总结,一则进行回顾复习,另则便于查询使用.本图文文档亦源于此.阅读Oracle RAC安装与使用教程前,笔者先对这篇文章整体构思和形成进行梳理.由于阅读者知识储备层次不同,我将从Oracle RAC安装前的准备与规划开始进行整体介绍安装部署Oracle RAC.始于唐博士指导,对数据库集群进行配置安装,前

浏览器工作原理及相关内核、技术介绍

好吧,我最喜欢的就是原理方面的介绍了..好处有两个:1.了解原因更方便与工(zhuang)作(bi):2.原理都是相同的,大道归一啊(吐) 正文开始: 一.浏览器工作原理(简化版) 1.浏览器用来干什么用 浏览器的主要功能是将用户请求访问的web资源呈现出来,它需要从服务器请求资源,并将其显示在浏览器窗口中,资源的格式通常是HTML,也包括PDF.image及其他格式.用户用URI(Uniform Resource Identifier 统一资源标识符)来指定所请求资源的位置. HTML和CSS

LVS的工作原理和相关算法

首先我们要了解LVS的工作机制: LVS里Director本身不响应请求,只是接受转发请求到后方,Realservers才是后台真正响应请求. LVS 工作原理基本类似DNAT,又不完全相像,它是一种四层交换,默认情况下来通过用户请求的的地址和端口,来判断用户的请求,从而转发到后台真正提供服务的主机,而判断这种请求的是通过套接字来实现,所以四层就可以实现.而且这个转发的过程对用户而言是透明的(简单的讲,就是用户访问的是DR的IP,而DR转发给RSS,而用户不知道这个过程) LVS的工作模式 1.

HBase的工作原理和相关操作

学习一个开源软件的基本思路都是(1)安装和配置(2)理解工作原理(3)命令操作(4)代码操作(5)研究源码(6)根据论文或需求进行二次开发.同样,学习HBase也不例外,但我省去了HBase集群(4台)的安装和配置,主要总结HBase的工作原理,Shell命令操作,Java代码操作相关内容. 一. HBase存储结构 1. Client 解析: 对于管理类的操作,Client与HMaster进行RPC,对于数据读写类的操作,Client与HRegionServer进行RPC. 2. ZooKee

Hive的工作原理和相关操作

Hive是一个基于Hadoop的数据仓库,提供比较完整的SQL功能(本质还是将SQL转换为MapReduce),可供数据分析师利用Hadoop对海量数据进行分析.但是,Hive也有自身的缺点,比如比较慢等. 一. Hive的工作原理和结构 二. Hive的基本操作 1. 表操作 2. 视图操作 3. 索引操作 4. 分区操作 5. 桶操作 三. 使用JDBC开发Hive程序

[iOS]浅谈NSRunloop工作原理和相关应用

一. 认识NSRunloop  1.1 NSRunloop与程序运行 那么具体什么是NSRunLoop呢?其实NSRunLoop的本质是一个消息机制的处理模式.让我们首先来看一下程序的入口——main.m文件,一个ios程序启动后,只有短短的十行代码居然能保持整个应用程序一直运行而没有退出,是不是有点意思?程序之所以没有直接退出是因为UIApplicationMain这个函数内部默认启动了一个跟主线程相关的NSRunloop对象,而UIApplicationMain这个函数一直执行没有返回就保存

[原创]java WEB学习笔记44:Filter 简介,模型,创建,工作原理,相关API,过滤器的部署及映射的方式,Demo

本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 ---------------------------------

java学习笔记(3):java的工作原理及相关基础

一.运行机制 如上图所示,图中内容即为Java的运行机制: 1.我们一开始所编写的代码文件存储格式为(如text.java)文件,这就是源程序文件 2.在Java编辑器的作用下,也就是就行了编译,形成字节码文件(如text.class)文件,其实,这个Java编译器是我们所说的Java虚拟机,其中,在命令行的处理方式如下: 要在当前文件目录下打开命令行进行编译 3.之后class文件经过类装载器.字节码校验器.解释器的处理,就变成了1010010……的二进制形式了,通过操作系统平台将结果显示在屏

解析Vue-router相关干货及工作原理

本文主要介绍了vue-router相关基础知识及单页面应用的工作原理,写的十分的全面细致,具有一定的参考价值,对此有需要的朋友可以参考学习下.如有不足之处,欢迎批评指正. 单页面工作原理是通过浏览器URL的#后面的hash变化就会引起页面变化的特性来把页面分成不同的小模块,然后通过修改hash来让页面展示我们想让看到的内容. 那么为什么hash的不同,为什么会影响页面的展示呢?浏览器在这里面做了什么内容.以前#后面的内容一般会做锚点,但是会定位到一个页面的某个位置,这个是怎么做到的呢,和我们现在