关于session的文章(zz)

关于session的文章 
刘正吉
[email protected]
未经作者同意改编,不过我相信他不会介意的

甲是某个网站的会员,他要登入网站线上购物,他在login.jsp打上他的帐号密码,认证通过後,伺服器把它丢到list.jsp浏览网站上的货物,当他选好要买的货物後要订购了,伺服器又把它丢到buy.jsp处理订货的事宜。甲这个人只在login.htm打上帐号密码,伺服器透过login.jsp确认甲是个合法注册的会员,但是list.jsp和buy.jsp使用者不需要打帐号密码,伺服器要如何确认现在进来的甲还是乙?又或者有人根本就不从login.jsp进入网站,他直接从list.jsp或buy.jsp进来,那不就避过了帐号密码的检查? 
  要解决这个问题,方法有很多,可以用html语法的<input type="hidden">的方法,或者是用cookie,但是以上两种方法的安全性还不够,应该用session来解决这个问题。刚才的问题,如果以session的流程来看,甲透过login.jsp进入网站,伺服器会给他一个独一无二的编号证明他就是甲(就好像每个人都有身份证字号,而且都不会重覆),如果是乙进来话,伺服器也给他一个独一无二的编号。这个独一无二的编号就是sessionID。这个sessionID会被送到使用者的浏览器内,当使用者到浏览其他网页时,浏览器会把这个sessionID送到伺服器,伺服器便可以比对现在来的是甲或是乙。 

1.如果你想要看你的sessionID长什么样子,语法应该这么写 
 session.getId(); 

2.甲或乙进入网站,服务器都会分配每个人一个session,每个人都不会重复,甲是会员,输入了帐号密码後顺利通过验证,这个服务器可以在他的session上做个记号,表示他通过了验证, 
  session.setAttribute("LogOk","yes"); 
这个意思是说,服务器在甲的session内放了一个LogOk的属性,它的值是"yes"。当然也还可以放别的东西,譬如说把甲输入的帐号密码放进去 
 session.setAttribute("userid","甲所输入的帐号"); 
 session.setAttribute("userpass","甲所输入的密码"); 
(请注意,这些Attribute的信息都是存在Server内,不会被送到使用者的浏览器内,会送到浏览器的只有sessionID而已。如此才能保障相关资料不被人窃取。) 
甲通过验证後,伺服器便把它导向到list.jsp做处理。(response.sendRedirect("list.jsp");)乙不是会员,当他从login.jsp进去後,没办法通过验证,於是被导向回login.jsp重新输入密码(response.sendRedirect("login.jsp");) 

3.甲被导向到list.jsp,list.jsp怎麽知道甲通过了验证,而且怎麽证明它是甲呢?可以透过下面方法把刚才在session上所做的记号取出来 
 String LogOk=(String)session.getAttribute("LogOk"); 
 String userid=(String)session.getAttribute("userid"); 
 String userpass=(String)session.getAttribute("userpass"); 
透过getAttribute取得LogOk的值,去检查一下LogOk是否等于"yes"就知道这个人有没有通过验证了,另外也取得了甲输入的帐号及密码,可以去资料库比对现在进来的是否是甲这个人。 
(要注意的是session.getAttribute("")的前面,在这个例子来讲,要加(String),因为透过setAttribute的方式存进session内的是个物件(Object),取出来时,要明确告诉java它是什麽物件,所以要用(String)session.getAttribute("LogOk")。同理,如果在存进session时是是存一个ResultSet,那取出来便要用(ResultSet)session.getAttribute("....");) 
而乙这个人呢,还不死心,login.jsp进不来,他还想骇进来,直接打list.jsp,同样的,程式从session内找出是否有LogOk,它的值是不是等於"yes",如果不是,很抱歉,又把它导回到login.jsp。 

透过session的方式,可以做到对同一个使用者在不同的网页之间资料的分享。基本上来说,tomcat对每一个网页进来的人都会建立session,其有效时间内定为30分钟,如果超过三十分钟使用者都没有再浏览任何网页,其sessionID便会失效,当然在session内所设定过属性也会消失。使用者再重新进来,便是另一个session了。 
以下的session方法,各位可以参考看看: 
session.setAttribute("属性名",属性值)----将资料存入session 
session.getAttribute("属性名");----从session取得资料 
session.setMaxInactiveInterval("秒数");---设定session的有效执行时间(单位:秒) 
session.getMaxInactiveInterval();----取得session的有效执行时间(单位:秒) 
session.isNew();----判断这个session是不是新的,是的话传回true,否则传回false 
session.invalidate();----强制session中断,常用在使用者登出时 
session.getCreateTime();----取得session建立的时间,其值为long值。 
session.getLastAccessedTime();----取得session最後的存取时间 

另外,如果有些网页,根本就不需要建立session,要如何把它关掉?应该在page的地方设定session="false" 
例:<%@ page contentType="text/html;charset=big5" session="false" %> 
如此,这个网页便不会建立任何session 
 

 

提问:关于设置Session的持续时间问题
session的设定在服务器的配置文件和页面中都可以设定,session的页面相关函数
public Object getAttribute(String name);得到变量
public java.util.Enumeration getAttributeNames( );得到变量的数组
public long getCreationTime( );这个session创建的时间
public String getId( );得到这个session的标示,其实就是你上面说的sessionid,当然也可以用getter方法得到
public long getLastAccessedTime( );最近一次session使用的时间
public int getMaxInactiveInterval( );得到session最长的停留时间
public void invalidate( );使当前的session失效
public boolean isNew( );判断是不是新建的session
public void removeAttribute(String name);删除session的属性,你的问题就可以使用这个方法
public void setAttribute(String name, Object attribute);设定属性值
public void setMaxInactiveInterval(int interval);设定session的停留时间,,我向你明白了这些函数的使用方法,你的问题就迎刃而解了
这些是网页中相关的函数,可以看看~


我用的session设定setMaxInactiveInterval(-1);API上说就是没超时常住内存,但我的session监听器中的

sessionDestroyed方法在页面关闭后却能捕获session消亡的信息.设为负数就会常驻内存,怎么还会捕获到呢.我很不解.


我的理解是:
session不会因为超时而失效,但是会话的终止一样会使会话失效。
常驻内存的前提是会话没有中断,否则他的存在就是一个垃圾,没有任何意义的保存在内存里。
对于需要始终存在与内存的信息你干吗要放在session里呢?放在application里阿?

我的疑问是这样的,session监听器中的sessionDestroyed方法是在一个session被内存清理掉时起做用吗?
那当我关闭一个页面后是否就该方法就起做用呢,还是要等到session超时才起做用!

打开页面,建立一个会话以后一直到关闭这个页面结束会话的这个时间里,如果会话停止超过一定时间就会失效。
而如果你关闭了页面会话都结束了,就根本没有超时这个说法了。

有一点你要清楚的是,jvm的垃圾回收会系统自动调用的,分配的内存空间被占用后到底什么时候都是不确定的,jvm的规范中队着一块很松散,没有具体的要求,所以各个jvm对于gc的实现都会不一样。所以sessionDestroyed方法绝对不可能在内存被清理掉而被调用,而可能是session失效时通过监听器方法被监听到而触发。

希望能够对你有帮助。

 

你可能感兴趣的:(jvm,tomcat,jsp,浏览器)