Session 杂谈

 

HTTP协议是无状态的协议。什么是无状态的协议呢,也就是说浏览器向服务器发出的每一次请求,都是独立的,与其前后访问的请求都没有任何的关系。也许在互联网的初期我们每次输入一个网址,得到返回的页面,这样就足够了。但随着web应用的轰轰烈烈的发展,这样简单的应用显然已无法满足各种的应用。于是我们可以通过表单、URL来在页面之间传递一些数据。并利用cookiesession机制来解决HTTP无状态无带来的不便。

 

说到Session就一定也要说到cookie ,这是两种不同的保存状态的机制。只不过Session是保存在服务器端,而cookie保存在客户端上。举个例子:过去上学的时候去火车站买学生票,每买一次,售票员就要在我们的学生证上盖一个章,下次再去的时候,售票员跟据学生证上的张数来确定是否还能售给我们学生票(学生票一年只能有四次购买机会),我们的学生证在这个例子里就是用来保存状态的,类似于cookie,是典型的客户端状态保存。后来火车站进行了系统的升级,每买一次票不再向学生上证盖章了,而是出示一下学生证,我们的学生证中只保存了一个ID,而购买的次数保存在火车站的数据库中(只是举个例子,可能真实的情况不是如此),这样每次购买时售票员跟据我们的ID,去确认一下是否可售给我们学生票,这样的机制就是服务器保存状态,也就是session机制。

 

可以看出,服务器保存的状态也是需要客户端保存一个ID的,但在一些系统中,cookie被禁止了,也就是说客户端无法保存信息了,这时如果还需要用Seesion来传递状态的话,就需要将SessionID通过页面的URL进行相互的传递。还是上个例子:如果你不想带学生证(怕丢了,出于安全考虑),那只能把你的ID印在脑门上,到哪都带着,用来进行状态的传递。在java中,HttpServletResponse接口提供了重写URL的方法encodeURL(String url)

它跟据是否使用Session以及客户端是否支持cookie来返回相应的URL,如果需要,它会把相关sessionID,加到URL后面。

 

由于session是保存在服务器端,所以会占用一部分系统的资源,因此我们总是想在某客户端不用的时候,就清空掉其session中的数据。我们能在应用中可以提供注销、关闭这样的功能时来清空session;也可在javascriptwindow.oncolose时,进行Session的清空,但对于浏览器进程被终止、浏览器出错、客户端死机等各种情况时,还是不能保证session会被清空的。于是,我们可以设置一个失效时间,也就是说一个时间段内如果没人来使用这个Session,那么就可以清空session中其相关的数据了。

 

还有一个问题,那就是如果服务器如果遇到意外,如何在服务器恢复后还能保存其seesion的数据。这就是Session的持久化问题了。就是把内存中session对象序列化到文件中,或数据库中,用的时候,再反序列化到内存里。另外,如果某些应用有大量的访问,Session持久化还能解决内存占用过高的问题。

 

tomcat里,session默认保存到<CATALINA_HOME>/work/Catalina/[主机名]/[应用名称]/ SESSIONS.ser中。但也可保存到其它文件中或数据库中。

 

tomcat 5中,我们可以在每个应用的配置文件下,加入相应的Manager元素

<CATALINA_HOME>/conf/Catalina/[主机名]/[应用名称].xml

来持久化到文件中或持久化到mysql数据库中,以及Manager标签中的各元素的意义,都可以上网查一查,很全的。

我在配置的时候,想持久化到sqlserver 2000中,由于不知道connectionURL怎么写,查了半天也查不着,都是mysql的例子。最后去英文网站去查,我英文很弱,费了好半天劲才找到,惭愧啊。

 

这是在应用的配置文件中的配置

   



< Manager  className  = "org.apache.catalina.session.PersistentManager" >
       debug = 0;
       saveOnRestart = "true"
       maxActiveSessions="-1"
       minIdleSwap = "-1"
       maxIdleSwap = "-1"
       maxIdleBackup = "-1"    
       
< Store  className ="org.apache.catalina.session.JDBCStore"  
       driverName 
= "com.microsoft.jdbc.sqlserver.SQLServerDriver"  
       connectionURL 
= "jdbc:microsoft:sqlserver://192.168.51.130:1433;DatabaseName=hello;user=sa;password="
       sessionTable 
= "MySession"                 [数据库中表名]
       sessionIdCol 
= "session_id"                  [字段名]
       sessionDataCol 
= "session_data"
       sessionValidCol 
= "valid"
       sessionMaxInactiveCol 
= "max_inactive"
       sessionLastAccessedCol 
= "last_access"
       sessionAppCol 
= "app_name"
       checkInterval 
= "60"
       debug 
= "99"
        
/>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值