jsp session实例以及使用时的注意事项



jsp session实例以及使用时的注意事项。写了一个模拟登录的例子,测试session。主要有这样一个jsp文件:

login.jsp
<%@ page language=”java” import=”java.util.*” pageEncoding=”UTF-8″%>
<%
String account = request.getParameter(“account”);
String pswd = request.getParameter(“pswd”);
System.out.println(session.getId()+” “+session.getAttribute(“user”));
if(session.getAttribute(“user”)==null){
if(account.equals(“dbuser”)&&pswd.equals(“dbpswd”)){
HashMap<String,String> user = new HashMap<String,String>();
session.setAttribute(“user”,user);
}
}else{
out.print(session.getId()+” “+session.getAttribute(“user”));
}
%>

以上代码,主要作用是,先接收传过来的帐号和密码,假设session中取不到user,则去数据库验证(在这里要假设我们已经取到了数据库中的account和pswd,省略数据库的操作),
如果匹配,则把user存入session中。
测试地址类似于:http://localhost/jdbc/login.jsp?account=dbuser&pswd=dbpswd
我首先用IE浏览器访问,看到服务器后台输出了
7A02F54B01164A32B7280E263BDCF539 null,
而第一次请求,浏览器中什么也没返回。说明这一次,进入了if(session.getAttribute(“user”)==null)

当第二次请求,看到服务器后台输出了
FC94B3C1946C3E791EEF79983D826125 {}
而这次请求,浏览器中返回了
FC94B3C1946C3E791EEF79983D826125 {}
说明了这次进入了if(session.getAttribute(“user”)==null)的else中,也就是说session中取user已经不为空了。

后面N次请求,都和第二次一样。
当我再打开一个IE浏览器,访问结果,仍然和第二次请求一样。

当我打开谷歌浏览器,每次得到的结果,依次和用IE访问的结果一样,只是sessionId不一样。即第一次访问,服务器后台输出C3C4AA584977125AB4C23CB76D2152C3 null,浏览器中无仍何结果,从第二次开始,
服务器后台和浏览器中均输出C3C4AA584977125AB4C23CB76D2152C3 {}。

当我关掉所有IE浏览器,以这个地址访问:

http://localhost/jdbc/login.jsp?account=aaa&pswd=1111

很明显,传过去的帐号密码不正确。
结果是,服务器后台始终输出:
8A7257F7C551EAD78148001C27AAF9F6 null
浏览器中始终无返回结果


通过以上试验,说明以下问题:
1、session的产生,是在成功建立一个服器器与客户端连接的时候。也就是客户端成功访问到服务器,session就产生了,与其它因素无关,比如是否登录成功。
2、每次建立一个连接,就自动创建一个session,自动创建一个session就会产生一个唯一的Id,俗称sessionId,可以用session.getId()得到。
3、session的消亡,一般在以下三种情况下:一、断开连接(比如关掉浏览器,服务器关闭);二、长时间未请求和响应;三、程序员使用代码注销。
4、同一种浏览器只能保持一个会话,比如,你用IE浏览器打开多个窗口,如果此时已经有IE浏览器在保持会话了,无论你打开多少个,始终是用的一个session,也就是同一个sessionId。

下面,再做一个升级版,还是上面个login.jsp,改动一下:
<%@ page language=”java” import=”java.util.*” pageEncoding=”UTF-8″%>
<%
String account = request.getParameter(“account”);
String pswd = request.getParameter(“pswd”);
System.out.println(session.getId()+” “+session.getAttribute(“user”));
if(session.getAttribute(“user”)==null){
if(account.equals(“dbuser”)&&pswd.equals(“dbpswd”)){
HashMap<String,String> user = new HashMap<String,String>();
session.setAttribute(“user”,”dbuser”);
}
if(account.equals(“aaa”)&&pswd.equals(“bbb”)){
HashMap<String,String> user = new HashMap<String,String>();
session.setAttribute(“user”,”aaa”);
}
}else{
out.print(session.getId()+” “+session.getAttribute(“user”));
}
%>

现在有两个用户,一个是dbuser,一个是aaa
我们分别用IE浏览器访问

http://localhost/jdbc/login.jsp?account=dbuser&pswd=dbpswd

用谷歌浏览器访问

http://localhost/jdbc/login.jsp?account=aaa&pswd=bbb

第一次,浏览器无返回,服务器后台输出
IE: A2A8E8E016649D5F25D6133A1D9634EB null
谷歌: 7BD555479D7C63DA5CFA48DDE36DFDC5 null
第二次,服务器后台和浏览器均输出
IE: A2A8E8E016649D5F25D6133A1D9634EB dbuser
谷歌: 7BD555479D7C63DA5CFA48DDE36DFDC5 aaa

这就说明了,我们只需要session.getAttribute(“user”)就可以了。
服务器可能同时存了多个名字为”user”的session,那么,会不会我getAttribute的时候,服务器取错了?
比如我想取aaa,是用session.getAttribute(“user”),而我们知道,dbuser也是用的session.setAttribute(“user”,”dbuser”),
这样可不可能取出来的结果不是aaa而是dbuser呢?
事实证明,不会。
简单地说,在一次请求中,服务器可以自己判断本次请求是属于哪一个sessionId,那么去getAttribute的时候,自然会自己判断sessionId。
当然,它是怎么判断的,我们也没必要去研究了。
总而言之,如果本次请求是aaa那个客户端发起的,服务器自然会在与这个客户端的会话中去getAttribute。