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

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

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

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

由于session是保存在服务器端,所以会占用一部分系统的资源,因此我们总是想在某客户端不用的时候,就清空掉其session中的数据。我们能在应用中可以提供注销、关闭这样的功能时来清空session;也可在javascript的window.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的例子。最后去英文网站去查,我英文很弱,费了好半天劲才找到,惭愧啊。

这是我建的表

若依的redis 版本在哪个pom 若依session_若依的redis 版本在哪个pom

 

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

若依的redis 版本在哪个pom 若依session_若依的redis 版本在哪个pom_02

<Manager className = "org.apache.catalina.session.PersistentManager">
       debug = 0;
       saveOnRestart = "true"
       maxActiveSessinotallow="-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"        />