会话管理和使用1、HTTP协议的无状态HTTP是无状态协议。如果一个协议不能记忆它之前的连接,就不能把某客户端的请求与另一个客户端区分开来,我们就说这个协议是无状态的。<1.1> 什么是会话<1.2> 状态和会话管理2、Servlet API 对会话的支持在Servlet API中使用HttpSession接口来实现会话,客户端向服务器发请求,服务器就会创建一个与当前请求相关联的会话对象。并使用HttpSession对象封装HTTP会话的重要信息,比如唯一的会话ID以及其他一些特定的客户信息。其中,特定的客户信息可以包含任何java对象。<2.1> HttpSession接口HttpSession接口实现了会话机制,并用Session来跟踪客户的状态。<2.2> 会话对象的创建在HttpServletRequest接口中定义了两种方式来创建会话,分别是getSession()和getSession(Boolean create)的方法。这两个方法都能返回与当前请求相关联的HttpSession对象。<2.3> 会话管理在Web应用中,会话必须很好地被管理,HttpSession接口中提供了管理会话的方法。P45示例3-1:package com3_1;
import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.text.SimpleDateFormat;import java.util.Date;import javax.servlet.http.HttpSession;
public class GetSessionInfoServlet extendsHttpServlet {public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);}public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("GBK"); response.setContentType("text/html;charset=GBK" PrintWriter out = response.getWriter(); //获取与当前请求相关的会话 HttpSession session = request.getSession(); Date creationTime = newDate(session.getCreationTime()); Date lastAccessed = newDate(session.getLastAccessedTime()); Date now = new Date(); SimpleDateFormat fmt = newSimpleDateFormat("yyyy-MM-dd-HH:mm:ss"); out.println(""); out.println(" 显示会话的信息
"); out.println(" "); out.print("会话创建和最后处理时间"); out.print("现在时间是:" + fmt.format(now) + "
"); out.println("会话创建时间是:" +fmt.format(creationTime) + "
"); out.println("会话ID是:" + session.getId() + "
"); out.println("会话最大活动期是:" +session.getMaxInactiveInterval() + "秒
"); out.println("最后处理时间是:" +fmt.format(lastAccessed)); out.println("
3、会话跟踪会话跟踪允许服务器确定访问站点的用户、用户访问站点的次数和用户停留站点的时间段。在客户端和服务器之间的会话ID和状态信息交换,Web服务器常有4种方法:● 使用Servlet API中的Session机制● 使用Cookic● 分别是将会话ID存放在URL路劲中、执行URL重写● 隐藏表单域<1> 使用Session的会话跟踪示例3-2:package com3_2;
import java.io.IOException;import java.io.PrintWriter;
import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;
public class ColorServlet extends HttpServlet {public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException { doPost(request,response);}public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("GBK"); response.setContentType("text/html;charset=GBK" String name = ""; String color = ""; String sfont = ""; Integer hitCount = new Integer(0); HttpSession session =request.getSession(true); PrintWriter out = response.getWriter(); out.print(""); out.print("会话跟踪");
if (session.isNew()) { //第一次请求页面,创建Session对象 hitCount = new Integer(1); out.print(""); out.print("method=POST>"); out.print("请选择你喜欢的背景颜色和字体"); out.print("bcolor value = white checked>白色"); out.print("bcolor value = red >红色"); out.print("bcolor value = green >绿色"); out.print("bcolor value = blue >蓝色");