Session 初步(二) 之 HTTP Session 浅析

来源:互联网 发布:三生网络直销违法吗 编辑:程序博客网 时间:2024/06/07 06:08

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

 

1、概念
Session 代表服务器与浏览器的一次会话过程,这个过程是连续的,也可以时断时续的。在 Servlet 中,Session 指的是HttpSession 类的对象。

 

2、Session创建的时间

一个常见的误解是以为 Session 在有客户端访问时就被创建,然而事实是直到某 Server 端程序调用
HttpServletRequest.getSession(true)
这样的语句时,Session 才被创建,注意如果 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,而这个对于浏览器操作的人来说,是不可见的,并且用户也无需关心自己处于哪个会话过程中。

 

0 0
原创粉丝点击