会话状态的维持是开发Web应用所必须面对的问题有多种方法可以来解决这个问题如使用Cookieshidden类型的表单域或直接把状态信息加到URL中等还有Servlet本身提供了一个HttpSession接口来支持会话状态的维持在这里我们主要介绍基于这个接口的会话状态的管理
Session的发明是为了填补HTTP协议的局限请注意HTTP协议是如何工作的用户发出请求服务器作出响应这种用户端和服务器色色端的联系就是离散的非连续的HTTP协议不能提供允许服务器跟蹤用户请求的功能在服务器端完成响应用户的请求之后服务器不能继续与该浏览器继续保持连接从服务器这端来看每一个请求都是独立的因此HTTP协议被认为是无状态协议当用户在多个主页间切换时服务器无法知道他的身份 Session的出现就是为了弥补这个局限利用Session您就可以当一个用户在多个主页间切换的时候也能保存他的信息这样很多以前根本无法去做的事情就变得简单多了
在访问者从到达某个特定的主页到离开为止的那段时间每个访问者都会单独获得一个Session
Java Servlet定义了一个HttpSession接口实现的Session的功能在Servlet中使用Session的过程如下
() 使用HttpServletRequest的getSession方法得到当前存在的session如果当前没有定义session则创建一个新的session还可以使用方法getSession(true)
() 写session变量可以使用方法HttpSessionsetAttribute(namevalue)来向Session中存储一个信息也可以使用HttpSessionputValue(namevalue)但这个方法已经过时了
()读Session变量可以使用方法HttpSessiongetAttribute(name)来读取Session中的一个变量值如果name是一个没有定义的变量那么返回的是null需要注意的是从getAttribute读出的变量类型是Object必须使用强制类型转换比如
String uid = (String) sessiongetAttribute(uid);
也可以使用HttpSessiongetValue(name)但是这个方法也已经过时了
() 关闭session当时用完session后可以使用sessioninvalidate()方法关闭session但是这并不是严格要求的因为Servlet引擎在一段时间之后自动关闭seesion
下面举一个简单的例子说明session的使用
//色色 SessionExamplejava
import javaio*;
import javautil*;
import javaxservlet*;
import javaxservlethttp*;
//导入必要的软件包
public class SessionExample extends HttpServlet
{
public void doGet(HttpServletRequest request HttpServletResponse response)
throws IOException ServletException //实现doGet方法
{
responsesetContentType(text/html); //设置HTTP头
PrintWriter out = responsegetWriter(); //得到输出gan
HttpSession session = requestgetSession(true);
//得到session对象
//打印HTML标记
outprintln(<html>);
outprintln(<head>);
outprintln(<meta httpequiv=\ContentType\ content=\text/html; charset=gb\>);
outprintln(</head>);
outprintln(<body>);
Date created = new Date(sessiongetCreationTime());
//得到session对象创建的时间
Date accessed = new Date(sessiongetLastAccessedTime());
//得到最后访问该session对象的时间
outprintln(ID + sessiongetId()+<br>);
//得到该session的id并打印
outprintln(Created: + created+<br>);
//打印session创建时间
outprintln(Last Accessed: + accessed+<br>);
//打印最后访问时间
sessionsetAttribute(UID);
//在session中添加变量UID=
sessionsetAttribute(NameTom);
//在session中添加变量Name=Tom
Enumeration e = sessiongetAttributeNames();
//得到session中变量名的枚举对象
while (ehasMoreElements()) { //遍历每一个变量
String name = (String)enextElement(); //首先得到名字
String value = sessiongetAttribute(name)toString();
//由名字从gan中得到值
outprintln(name + = + value+<br>); //打印
}
outprintln(</body>); //打印HTML标记
outprintln(</html>);
}
}
}