深入理解HTTP Session

session在web开发中是一个非常重要的概念,这个概念很抽象,很难定义,也是最让人迷惑的一个名词,也是最多被滥用的名字之一,在不同的场合,session一次的含义也很不相同。这里只探讨HTTP Session。
为了说明问题,这里基于Java Servlet理解Session的概念与原理,这里所说Servlet已经涵盖了JSP技术,因为JSP最终也会被编译为Servlet,两者有着相同的本质。
在Java中,HTTP的Session对象用javax.servlet.http.HttpSession来表示。

1、概念:

Session代表服务器与浏览器的一次会话过程,这个过程是连续的,也可以时断时续的。在Servlet中,session指的是HttpSession类的对象,这个概念到此结束了,也许会很模糊,但只有看完本文,才能真正有个深刻理解。

2、Session创建的时间是:

一个常见的误解是以为session在有客户端访问时就被创建,然而事实是直到某server端程序调用 HttpServletRequest.getSession(true)这样的语句时才被创建,注意如果JSP没有显示的使用 <% @page session="false"%> 关闭session,则JSP文件在编译成Servlet时将会自动加上这样一条语句 HttpSession session = HttpServletRequest.getSession(true);这也是JSP中隐含的 session对象的来历。
由于session会消耗内存资源,因此,如果不打算使用session,应该在所有的JSP中关闭它。
引申:
1)、访问*.html的静态资源因为不会被编译为Servlet,也就不涉及session的问题。
2)、当JSP页面没有显式禁止session的时候,在打开浏览器第一次请求该jsp的时候,服务器会自动为其创建一个session,并赋予其一个sessionID,发送给客户端的浏览器。以后客户端接着请求本应用中其他资源的时候,会自动在请求头上添加:
Cookie:JSESSIONID=客户端第一次拿到的session ID
这样,服务器端在接到请求时候,就会收到session ID,并根据ID在内存中找到之前创建的session对象,提供给请求使用。这也是session使用的基本原理----搞不懂这个,就永远不明白session的原理。
下面是两次请求同一个jsp,请求头信息:

通过图可以清晰发现,第二次请求的时候,已经添加session ID的信息。
 
3、Session删除的时间是:
1)Session超时:超时指的是连续一定时间服务器没有收到该Session所对应客户端的请求,并且这个时间超过了服务器设置的Session超时的最大时间。
2)程序调用HttpSession.invalidate()
3)服务器关闭或服务停止
4、session存放在哪里:服务器端的内存中。不过session可以通过特殊的方式做持久化管理。
5、session的id是从哪里来的,sessionID是如何使用的:当客户端第一次请求session对象时候,服务器会为客户端创建一个session,并将通过特殊算法算出一个session的ID,用来标识该session对象,当浏览器下次(session继续有效时)请求别的资源的时候,浏览器会偷偷地将sessionID放置到请求头中,服务器接收到请求后就得到该请求的sessionID,服务器找到该id的session返还给请求者(Servlet)使用。一个会话只能有一个session对象,对session来说是只认id不认人。
6、session会因为浏览器的关闭而删除吗?
不会,session只会通过上面提到的方式去关闭。
7、同一客户端机器多次请求同一个资源,session一样吗?
同一客户端机器一般来说,每次请求都会新创建一个session。

其实,这个也不一定的,总结下:对于多标签的浏览器(比如360浏览器)来说,在一个浏览器窗口中,多个标签同时访问一个页面,session是一个。对于多个浏览器窗口之间,同时或者相隔很短时间访问一个页面,session是多个的,和浏览器的进程有关。对于一个同一个浏览器窗口,直接录入url访问同一应用的不同资源,session是一样的。
8、session是一个容器,可以存放会话过程中的任何对象。
9、session因为请求(request对象)而产生,同一个会话中多个request共享了一session对象,可以直接从请求中获取到session对象。
10、其实,session的创建和使用总在服务端,而浏览器从来都没得到过session对象。但浏览器可以请求Servlet(jsp也是Servlet)来获取session的信息。客户端浏览器真正紧紧拿到的是session ID,而这个对于浏览器操作的人来说,是不可见的,并且用户也无需关心自己处于哪个会话过程中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/539918.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hibernate的懒加载session丢失解决方法

在web.xml加入spring提供的过滤器&#xff0c;延长session的生命周期 <!--Hibernate的懒加载session丢失解决方法 --><filter><filter-name>openSessionInView</filter-name><filter-class>org.springframework.orm.hibernate4.support.OpenSess…

Linux访问其他进程空间,Linux环境进程间通信系列(五):共享内存

共享内存可以说是最有用的进程间通信方式&#xff0c;也是最快的IPC形式。两个不同进程A、B共享内存的意思是&#xff0c;同一块物理内存被映射到进程A、B各自的进程地址空间。进程A可以即时看到进程B对共享内存中数据的更新&#xff0c;反之亦然。由于多个进程共享同一块内存区…

冲刺NO.8

Alpha冲刺第八天 站立式会议 项目进展 项目稳步进行&#xff0c;项目的基础部分如基本信息管理&#xff0c;信用信息管理等部分已相对比较完善。 问题困难 技术困难在短期内很难发生质的变化&#xff0c;而本项目由于选择了队员不太熟悉的程序框架&#xff0c;所以所以项目的交…

linux由众多微内核组成,什么是linux

大家对Linux这个词比较陌生吧&#xff0c;那么Linux是什么呢&#xff1f;Linux是什么Linux是一种自由和开放源码的类Unix操作系统。目前存在着许多不同的Linux&#xff0c;但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中&#xff0c;从手机、平板电脑、路由器和视…

浅析jQuery中常用的元素查找方法总结

$("#myELement") 选择id值等于myElement的元素&#xff0c;id值不能重复在文档中只能有一个id值是myElement所以得到的是唯一的元素 $("div") 选择所有的div标签元素&#xff0c;返回div元素数组 $(".myClass") 选择使用myClass类的css的所有…

右击菜单一键优化(增加新建office2003、新建reg和bat,删除新建公文包、新建wps、新建rar)...

右击菜单一键优化&#xff08;增加新建office2003、新建reg和bat&#xff0c;删除新建公文包、新建wps、新建rar&#xff09; Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\.doc]"Word.Document.8""Content Type""application/msword&qu…

jquery获取select选择的显示值

转载自&#xff1a;http://blog.csdn.net/a5489888/article/details/8611703 本来以为jQuery("#select1").val();是取得选中的值&#xff0c; 那么jQuery("#select1").text();就是取得的文本。 这是不正确的&#xff0c;正确做法是&#xff1a; jQuery(&qu…

克隆整个linux系统环境的软件,开源的系统克隆工具 Clonezilla(再生龙)linux、UBUNTU备份不用愁...

Clonezilla是一个很好的系统克隆工具,它基于Partimage,吸取了Norton Ghost和Partition Image的优点。即不仅支持对整个系统进行克隆,而且也可以克隆单个的分区,这种灵活性可能更能适应备份者的需要。支持GNU/Linux的文件系统 ext2、ext3、reiserfs、xfs、jfs和Windows的FAT、FA…

SqlServer2008备份与还原(完整图示版)

一、备份 1、在需要备份的数据库上&#xff0c;右键——任务——备份&#xff0c;如下&#xff1a; 2、选择备份到哪个路径和备份名字&#xff1a; 点击“添加”&#xff0c;如下&#xff0c; 3、上面点击“确定”后&#xff0c;回到第一个页面&#xff0c;选中刚才添加的路径和…

Jquery mobile问题总汇

转载&#xff1a;http://www.wglong.com/main/artical!details?id4#q6 1页面缩放显示问题 问题描述&#xff1a; 页面似乎被缩小了&#xff0c;屏幕太宽了。 解决办法&#xff1a; 在head标签内加入&#xff1a; <meta name"viewport" content"widthdevice…

Linux通过文件大小查找,linux 根据文件大小查找文件

linux下的find命令用来查找文件&#xff0c;通过man find就知道它是无所不能的。所以按照文件大小来查找文件就不在话下。从man find搜索size&#xff0c;可以看到如下信息&#xff1a;-size n[cwbkMG]File uses n units of space. The following suffixes can be used:b for 5…

DBCP连接池介绍

DBCP连接池介绍 ----------------------------- 目前 DBCP 有两个版本分别是 1.3 和 1.4。 DBCP 1.3 版本需要运行于 JDK 1.4-1.5 &#xff0c;支持 JDBC 3。 DBCP 1.4 版本需要运行于 JDK 1.6 &#xff0c;支持 JDBC 4。 1.3和1.4基于同一套源代码&#xff0c;含有所有的bug修…

linux解释名词shell环境,Linux 定时任务

实现linux定时任务有:cron、anacron、at等&#xff0c;这里主要介绍cron服务。名词解释&#xff1a;cron是服务名称&#xff0c;crond是后台进程&#xff0c;crontab则是定制好的计划任务表。软件包安装&#xff1a;要使用cron服务&#xff0c;先要安装vixie-cron软件包和cront…

Python3 实现用户登陆,输入三次密码

不加注释版 #/usr/bin/python3 import readline user "seven" passwd "123" username input("please the enter user:") for i in range(3):password input("please the enter password:")if password.isdigit():password int(pa…

linux pcre静态编译,Linux下,Nginx部署静态网站

1、准备工作选首先安装这几个软件&#xff1a;GCC&#xff0c;PCRE(Perl Compatible Regular Expression)&#xff0c;zlib&#xff0c;OpenSSL。Nginx是C写的&#xff0c;需要用GCC编译&#xff1b;Nginx的Rewrite和HTTP模块会用到PCRE&#xff1b;Nginx中的Gzip用到zlib&…

【HTML5初探之本地存储】如果没有数据库。。。

导航【初探HTML5之使用新标签布局】用html5布局我的博客页&#xff01;【HTML5初探之form标签】解放表单验证、增加文件上传、集成拖放【HTML5初探之绘制图像&#xff08;上&#xff09;】看我canvas元素引领下一代web页面【HTML5初探之绘制图像&#xff08;下&#xff09;】看…

FragmentActivity和Activity的具体区别

fragment是3.0以后的东西&#xff0c;为了在低版本中使用fragment就要用到android-support-v4.jar兼容包,而fragmentActivity就是这个兼容包里面的&#xff0c;它提供了操作fragment的一些方法&#xff0c;其功能跟3.0及以后的版本的Activity的功能一样。 下面是API中的原话&am…

算法理论

ylbtech-Arithmetic:算法理论-- -- ylb&#xff1a;算法-- Type:算法-- 简简单单的一个月&#xff0c;完成一个台阶的提升-- 1&#xff0c;着重于算法的研究&#xff08;谢谢她为我出的那道题&#xff09;-- 2&#xff0c;可以不太依附工具环境开发&#xff0c;现在,也可使用记…

linux环境OpenRASP使用教程,集成openRASP与攻击测试

1.介绍openRASP是一个百度的安全框架&#xff0c;将其集成到我们的web项目中&#xff0c;就像是给web项目安装了一款“安全管家”的软件&#xff0c;它可以检测到攻击&#xff0c;并进行拦截。2.集成openRASP到项目中openRASP针对不同的服务器&#xff0c;提供了不同的安装方法…

JQuery调用iframe子页面函数/对象的方法

JQuery调用iframe子页面函数/对象的方法例子&#xff1a; 父页面有个ID为mainfrm的iframe&#xff0c;iframe连接b.html&#xff0c;该页面有个函数test 在父页面调用b.html的test方法为&#xff1a; $("#mainfrm")[0].contentWindow.test();