1、 会话管理和使用 1、HTTP协议的无状态 HTTP是无状态协议。如果一个协议不能记忆它之前的连接,就不能把某客户端的请求与另一个客户端区分开来,我们就说这个协议是无状态的。 <1.1> 什么是会话 <1.2> 状态和会话管理 2、Servlet API 对会话的支持 在Servlet API中使用HttpSession接口来实现会话,客户端向服务器发请求,服务器就会创建一个与当前请求相关联的会话对象。并使用HttpSession对象封装HTTP会话的重要信息,比如唯一的会话ID以及其他一些特定的客户信息。其中,特定的客户信息可以包含任何java对象。 <2.1> HttpS
2、ession接口 HttpSession接口实现了会话机制,并用Session来跟踪客户的状态。 <2.2> 会话对象的创建 在HttpServletRequest接口中定义了两种方式来创建会话,分别是getSession()和getSession(Boolean create)的方法。这两个方法都能返回与当前请求相关联的HttpSession对象。 <2.3> 会话管理 在Web应用中,会话必须很好地被管理,HttpSession接口中提供了管理会话的方法。P45 示例3-1: package com3_1; import java.io.IOException;
3、 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.HttpSessi
4、on; public class GetSessionInfoServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request,response); } public void doPost(HttpServletRequest request, HttpServletResponse response)
5、 throws ServletException, IOException { request.setCharacterEncoding("GBK"); response.setContentType("text/html;charset=GBK"); PrintWriter out = response.getWriter(); //获取与当前请求相关的会话 HttpSession session = request.getSession(); Date creationTime = new Date(session.getCreationTime()
6、); Date lastAccessed = new Date(session.getLastAccessedTime()); Date now = new Date(); SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd-HH:mm:ss"); out.println(""); out.println("
7、处理时间");
out.print("现在时间是:" + fmt.format(now) + "
");
out.println("会话创建时间是:" + fmt.format(creationTime) + "
");
out.println("会话ID是:" + session.getId() + "
");
out.println("会话最大活动期是:" + session.getMaxInactiveInterval() + "秒
");
out.println("最后处理时间是:" + f
8、mt.format(lastAccessed)); out.println("
9、>");
out.println("会话是有效的吗?:" + request.isRequestedSessionIdValid() + "
");
//销毁会话
session.invalidate();
out.println(" ");
out.println("");
out.flush();
out.close();
}
}
3、会话跟踪
会话跟踪允许服务器确定访问站点的用户、用户访问站点的次数和用户停留站点的时间段。在客户端和服务器之间的会话ID和状态信息交换,Web服务器常有4种方法:
10、 ● 使用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.HttpSe
11、rvletRequest; 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
12、); } 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 hi
13、tCount = new Integer(0); HttpSession session = request.getSession(true); PrintWriter out = response.getWriter(); out.print(""); out.print("
14、>"); out.print("
"); }else{ //第二请求,不再创建Session对象 //从request对象里拿值 color = request.getParameter("bcolor"17、); name = request.getParameter("name"); sfont = request.getParameter("sfont"); //其他的更多次的请求,此时,request对象里不再有值了 if (color != null&&name != null&&sfont != null) { hitCount = new Integer(1); session.setAttribute("color", color); session.setAttribute("hitCount", hitCount);
18、 session.setAttribute("name", name); session.setAttribute("sfont", sfont); }else{ //从不同的Session对象中取值 color = (String)session.getAttribute("color"); hitCount = (Integer)session.getAttribute("hitCount"); name = (String)session.getAttribute("name"); sfont = (String
19、)session.getAttribute("sfont"); } session.setAttribute("hitCount", new Integer(hitCount.intValue()+1)); out.print("
"); out.print("你请求这个页面"+hitCount+"次
");20、 out.print("
"); } out.print(""); out.print(""); out.flush(); out.close(); } } <2> 使用Cookie Servlet API中提供了Cookie类来实现Cookie,并定义了添加Cookie和获取Cookie的方法,同时,也定义了管理Cookie的方法。 示例3-3代码: package com3_3; import java.io.IOExcepti21、on; import java.io.PrintWriter; import java.util.Enumeration; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.ht
22、tp.HttpSession; public class CookieWriteAndReadServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request,response); } public void doPost(HttpServletRequest request, HttpServletRespon
23、se response) throws ServletException, IOException { request.setCharacterEncoding("GBK"); response.setContentType("text/html;charset=GBK"); //创建会话对象 HttpSession session = request.getSession(); //构造两个Cookie对象 Cookie customerID = new Cookie("customerID","123456"); Cookie color
24、 new Cookie("color","blue"); customerID.setMaxAge(300); color.setMaxAge(300); //把Cookie添加到相应头 response.addCookie(customerID); response.addCookie(color); PrintWriter out = response.getWriter(); out.println(""); out.println("
25、 out.println("
"); out.println("客户端本机上的Cookie| cookie名字 | cookie的值 |
| "+ cookies[i].getName()+" | "); out.println(""+ cookies[i].getValue() +" |
| 头名字 | 头的值 |
| " + name + " | "+request.getHeader(name)+" |