您的位置:首页 > Web前端 > JavaScript

JSP的内置对象之session

2016-08-20 21:24 190 查看

session在web开发过程中是非常重要的一个概念。无论是具体用哪一种开发语言进行web开发,基本上都要借助session操作来完成所需要的功能逻辑,但是session在不同的场合中可能会有不同的含义。这里是基于Java Servlet理解Session的概念与原理。这里所说Servlet已经涵盖了JSP技术,因为JSP最终也会被编译为Servlet,两者有着相同的本质。

在java web开发中的session 具体是指HttpSession,HTTP的Session对象用javax.servlet.http.HttpSession来表示。

session的概念

session在网络中常称为会话,指的是在一段时间内,单个客户与Web服务器的一连串相关的交互过程。在一个 Session中,客户可能会多次请求访问同一个网页,也有可能请求访问各种不同的服务器资源。

session的生命周期

session的创建

1.什么时候被创建?

Session存储在服务器端,Sessinon在用户访问第一次访问服务器时创建,需要注意只有访问JSP、Servlet等程序时才会创建Session,只访问HTML、IMAGE等静态资源并不会创建Session,但是可调用request.getSession(true)强制生成Session。

2.怎么创建?

当一个session开始时,Servlet容器将创建一个HttpSession对象,在HttpSession对象中可以存放客户状态信息;Servlet容器为HttpSession分配一个唯一的标识符,称为Session ID。Servlet容器把Session ID作为Cookie保存在客户的浏览器中(需要注意的是这里所指的cookie是值session cookie,这有别于persistent cookies)。每次客户发出HTTP请求时,Servlet容器可以从HttpRequset对象中取出Session ID,然后根据Session ID找到相应的HttpSession对象,从而获取客户的状态信息。以后客户端接着请求本应用中其他资源的时候就会在请求头添加:
Cookie:JSESSIONID=客户端第一次获取的Session ID
这样,服务端在接到请求,就会收到session ID,并根据ID在内存中找到之前所创建Sesssion对象,提供给请求使用。

session的销毁

1.Session超时;超时是指连续一定时间服务器没有收到该session所对于客户端的请求,并且这个时间超过了服务器设置的session超时的最大时间。Tomcat服务器一般默认时间为30分钟(也有些资料说默认时间为20分钟,具体的值可以查看Tomcat的安装目录下conf\web.xml文件里的默认设置)。可以通过以下几种方法来设置session的最大有效时间:

/*session的设置以分为单位,设为-1则表示无超时限制,在设定的时间内无request则session无效。
session根据生效范围可分别在服务器、项目和程序中进行设置:*/
/*1.服务器(针对服务器内所有session):%TOMCAT_HOME%\conf\web.xml*/
<session-config>
<session-timeout>30</session-timeout>
</session-config>
/*2.项目(针对具体某个项目内所有session):
%PROJECT_HOME%\WEB-INF\web.xml*/
<session-config>
<session-timeout>30</session-timeout>
</session-config>
//3.程序(针对具体一个session):
session.setMaxInactiveInterval(30);


2.程序调用HttpSession.invalidate()

3.服务器关闭或者服务停止

注意:只有以上三种方法才能销毁session。有个比较大的误区是说关闭浏览器后也会导致session立刻被销毁,这说法从本质上来讲是不对的。因为当直接关闭浏览器时,这个SessionId依旧是存在服务端,只不过再也没有客户端会携带它然后交予服务端校验。此SessionId已经失去了它存在的价值,会等待Session过期或者程序强制销毁,然后结束自己的年华。

session对浏览器的要求

从上面介绍session的创建中我们知道,session工作机制用到了cookie,而使用cookie又需要浏览器的支持,所以一般要求浏览器支持cookie且不禁止使用cookie。我们所讨论与session相关的cookie是由服务器端自动生成,它的属性maxAge一般被设为-1,表示仅当前浏览器有效,并且各浏览器窗口间不共享。因此同一部机器的两个浏览器窗口访问服务器是,会产生两个不同的session。由浏览器窗口内的链接、脚本等打开的新窗口(也就是说不是双击桌面浏览器图标等打开的窗口)除外。这类子窗口会共享父窗口的Cookie,因此会共享一个Session。

既然session的使用需要客户端浏览器的支持,那如果客户端浏览器将cookie禁用,或者不支持cookie怎么办?

Java web提供了URL地址重写的解决方案。URL地址重写的原理是将该用户Session的id信息重写到URL地址中。服务器能够解析重写后的URL获取Session的id。这样即使客户端不支持Cookie,也可以使用Session来记录用户状态。HttpServletResponse类提供了encodeURL(String url)实现URL地址重写,该方法会自动判断客户端是否支持Cookie。如果客户端支持Cookie,会将URL原封不动地输出来。如果客户端不支持Cookie,则会将用户Session的id重写到URL中。

**基于以上说法,本人禁用了浏览器的cookie并且没有进行URL重写做了测试,但却没有出现不能跟踪session状态的情况,这一点让我很费解。在网上查了很多相关资料也并没有得到一个官方的解释。其中一个本人认为比较合理解释是说,在许多服务器上,如果浏览器支持的话它们就使用cookies,但是如果不支持或废除了的话就自动转化为URL-rewriting,session自动为每个流程提供了方便地存储信息的方法。

Java web开发中如何使用session

创建和获取客户的会话

setAttribute()方法

该方法用于将信息保存在session范围内,语法如下:

session.setAttribute(String name,Object obj);


参数说明
name:用于指定作用域在session范围的变量名。

obj:保存在session范围内的对象。

getAttribute()方法

该方法用于获取保存在session范围内的信息,语法如下:

session.getAttribute(String name);


参数说明
name:指定保存在session范围内的关键字

说明:getAttribute()方法的返回值是Object类型,所以要将返回的Object类型转成相对应的类型。

从会话中移除指定的绑定对象

removeAttribute()方法

该方法用于移除保存在session范围内的变量,其语法如下:

removeAttribute(String name);


参数说明
name:用于指定作用域在session范围内的变量名。必须保证变量在session范围内有效,否则将抛出异常。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  session jsp java servlet 对象