10. Servlet Session 处理
来源:互联网 发布:布袋除尘器算法 编辑:程序博客网 时间:2024/05/20 17:58
Servlet Session 处理
- HTTP 是一种"无状态"协议,这意味着每次客户端检索网页时,客户端打开一个单独的连接到 Web 服务器,服务器会自动不保留之前客户端请求的任何记录;
- 一般有以下3种方式来维持 Web 客户端和 Web 服务器之间的 session 会话:
① Cookies
一个 Web 服务器可以分配一个唯一的 session 会话 ID 作为每个 Web 客户端的 cookie,对于客户端的后续请求可以使用接收到的 cookie 来识别,但是很多浏览器不支持 cookie,因此不建议使用这种方式来维持 session 会话。
② 隐藏的表单字段
一个 Web 服务器可以发送一个隐藏的 HTML 表单字段,以及一个唯一的 session 会话 ID,如下所示:<input type="hidden" name="sessionid" value="12345">该条目意味着,当表单被提交时,指定的名称和值会被自动包含在 GET 或 POST 数据中。每次当 Web 浏览器发送回请求时,session_id 值可以用于保持不同的 Web 浏览器的跟踪。这可能是一种保持 session 会话跟踪的有效方式,但是点击常规的超文本链接(<A href...>)不会导致表单提交,因此隐藏的表单字段也不支持常规的 session 会话跟踪。③ URL 重写
可以在每个 URL 末尾追加一些额外的数据来标识 session 会话,服务器会把该 session 会话标识符与已存储的有关 session 会话的数据相关联。例如,http://w3cschool.cc/file.htm;sessionid=12345,session 会话标识符被附加为 sessionid=12345,标识符可被 Web 服务器访问以识别客户端。URL 重写是一种更好的维持 session 会话的方式,它在浏览器不支持 cookie 时能够很好地工作,但是它的缺点是会动态生成每个 URL 来为页面分配一个 session 会话 ID,即使是在很简单的静态 HTML 页面中也会如此。
HttpSession 对象处理 Session
- HttpSession 接口提供了一种跨多个页面请求或访问网站时识别用户以及存储有关用户信息的方式;
- Servlet 容器使用这个接口来创建一个 HTTP 客户端和 HTTP 服务器之间的 session 会话。会话持续一个指定的时间段,跨多个连接或页面请求;
可以通过调用 HttpServletRequest 的公共方法 getSession() 来获取 HttpSession 对象:
1
HttpSession session = request.getSession();
以下是一个关于Session追踪的示例:
利用Session实现同一个会话中对访问次数进行计数的功能
1
public class Demo extends HttpServlet{
2
public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IoException{
3
4
//创建session(参数true表示在页面不存在Session时创建该Session)
5
HttpSession session = request.getSession(true);
6
7
//获取一些session信息
8
String sessionId = session.getId();
9
SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
10
String createTime = format1.format(new Date(session.getCreationTime()));
11
String lastAccessTime = format1.format(new Date(session.getLastAccessTime()));
12
13
//计算vistCount,并重新写入到session中
14
int vistCount = 0;
15
if(!session.isNew()) //当session不是首次产生时,开始计数
16
vistCount = (Integer)session.getAttribute("vistCount") + 1;
17
session.setAttribute("vistCount",vistCount);
18
19
//返回响应正文
20
response.setContentType("text/html;charset=UTF-8");
21
PrintWriter out = response.getWriter();
22
out.println("<!DOCTYPE html><html><body>");
23
out.println("<p>session id:"+sessionId+"</p>");
24
out.println("<p>create time:"+createTime+"</p>");
25
out.println("<p>last access time:"+lastAccessTime+"</p>");
26
out.println("<p>vist count"+vistCount+"</p>");
27
out.println("</body></html>");
28
}
29
}