资源描述
实验五 会话管理
一、实验目的
1。 了解Web服务器对客户跟踪的各种方法;
2. 重点掌握使用HttpSession对象跟踪会话的方法;
3。 掌握使用Cookie技术跟踪会话的方法;
4。 了解URL重写和隐藏表单域的方法。
二、实验原理
HTTP协议是无状态的协议.在很多情况下,Web服务器必须能够跟踪客户的状态。比如,对于一个购物网站,在一个时刻可能有多个客户购物,Web服务器必须能够区分不同的客户.一般情况下,Web服务器为每个客户配置了虚拟的购物车(ShoppingCart)。当某个客户请求将一个商品放入购物车时,Web服务器必须根据发出请求的客户的身份,找到该客户的购物车,然后把商品放入其中。
Web服务器跟踪客户的状态通常有4种方法:
(1)使用HttpSession对象管理会话;(2)使用持久的Cookie对象;(3)使用URL重写机制;(4)使用隐藏的表单域。
三、实验内容与步骤
(一) 使用HttpSession对象管理会话。
【步骤1】建立Servlet对象,代码如下:
package cn。edu.session.servlet;
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 LoginServlet extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request。setCharacterEncoding("utf—8");
response。setContentType("text/html;charset=utf-8”);
String username = request。getParameter(”username”);
if(username。equalsIgnoreCase(”zhangsan”)) {
response.getWriter()。print("用户名或密码错误!");
} else {
HttpSession session = request.getSession();
session.setAttribute(”username”, username);
response.sendRedirect("/prac05_session/index1。jsp”);
}
}
}
【步骤2】修改web。xml文件,添加代码如下:
〈servlet〉
〈servlet—name〉LoginServlet〈/servlet-name〉
〈servlet—class>cn。edu。session.servlet。LoginServlet〈/servlet—class〉
</servlet〉
【步骤3】新建login.jsp页面,代码如下:
<%@ page language="java” import=”java。util。*” pageEncoding=”UTF—8”%〉
<!DOCTYPE HTML PUBLIC "—//W3C//DTD HTML 4.01 Transitional//EN">
<html〉
<head〉
〈title〉login。jsp〈/title>
〈/head>
<body〉
〈h1〉login.jsp〈/h1>
〈hr/>
<form action=”/prac05_session/sessionLoginServlet” method="post”〉
用户名:<input type=”text” name=”username” /〉<br/〉
〈input type=”submit” value=”Submit"/〉
〈/form〉
〈/body〉
〈/html〉
【步骤4】新建index1.jsp页面,代码如下:
〈%@ page language=”java” import=”java。util。*” pageEncoding=”UTF—8”%〉
<!DOCTYPE HTML PUBLIC "—//W3C//DTD HTML 4。01 Transitional//EN”>
〈html〉
〈head〉
<title>index1。jsp</title〉
〈/head〉
〈body〉
〈h1〉index1。jsp</h1>
〈%
String username = (String)session。getAttribute(”username”);
if(username == null) {
out。print("您还没有登录!");
} else {
out。print(”用户名:” + username);
}
%〉
〈hr/>
〈a href="/prac05_session/index2.jsp”>index2</a>
</body〉
〈/html〉
【步骤5】新建index2。jsp页面,代码如下:
〈%@ page language=”java" import="java。util.*” pageEncoding=”UTF—8"%〉
〈!DOCTYPE HTML PUBLIC "—//W3C//DTD HTML 4。01 Transitional//EN”>
<html>
〈head>
〈title〉index2。jsp</title〉
</head>
〈body〉
〈h1〉index2。jsp〈/h1>
〈%
String username = (String)session.getAttribute(”username”);
if(username == null) {
out。print("您还没有登录!”);
} else {
out。print("用户名:" + username);
}
%〉
<hr/〉
〈a href=”/prac05_session/index1.jsp”〉index1〈/a〉
〈/body>
</html〉
图5。1 login。jsp页面
图5。2 重定向后页面
(二)使用Cookie跟踪会话
使用Cookie跟踪会话涉及到向客户端写入Cookie和从客户端读取Cookie。
注意UUID的用法。
【步骤1】向客户端写入Cookie对象
package cn.edu。cookie;
import java.io。IOException;
import java.io。PrintWriter;
import java.util。UUID;
import javax。servlet。ServletException;
import javax。servlet.http。Cookie;
import javax。servlet。http。HttpServlet;
import javax.servlet。http。HttpServletRequest;
import javax。servlet。http.HttpServletResponse;
public class AddCookie extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response。setContentType(”text/html;charset=utf—8”);
String id = UUID.randomUUID()。toString();// 生成一个随机字符串
Cookie cookie = new Cookie("id", id);// 创建Cookie对象,指定名字和值
response。addCookie(cookie);// 在响应中添加Cookie对象
response.getWriter()。print(”已经给你发送了ID");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
访问上述Servlet将向客户端写入一个Cookie,执行后可查看客户机对应目录看是否写了一个文件.
图5.3SendCookie程序的运行结果
【步骤2】从客户端读取Cookie对象
package cn。edu.cookie;
import java。io。IOException;
import java。io。PrintWriter;
import javax。servlet。ServletException;
import javax。servlet。http。Cookie;
import javax。servlet.http。HttpServlet;
import javax.servlet。http.HttpServletRequest;
import javax.servlet.http。HttpServletResponse;
public class GetCookie extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response。setContentType("text/html;charset=utf-8”);
Cookie[] cs = request。getCookies();//获取请求中的Cookie
if(cs != null) {//如果请求中存在Cookie
for(Cookie c : cs) {//遍历所有Cookie
if(c。getName()。equals("id”)) {//获取Cookie名字,如果Cookie名字是id
response.getWriter()。print(”您的ID是:” + c。getValue());//打印Cookie值
}
}
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request,response);
}
}
图5。4 GetCookie程序的运行结果
四、思考题
1。 简述会话管理的常用方法有哪些?
答:使用Servlet API的Session机制,使用持久的Cookie对象,使用URL重写机制,使用隐藏的表单域。
2。 如何使用HttpSession对象共享数据?
答: Public void setAttribute(String name,Object value)j将一个指定名称和值的属性绑定到会话对象上,Public void getAttribute(String name)返回绑定到会话上的指定名称属性值,Public void Enumeratinon getAttributeName()返回所用绑定到会话上的属性名的Enumeratinon对象,Public void removeAttribute(String name,)从会话中删除绑定的指定名称的属性。
五、实验总结
本次实验主要是使我们了解Web服务器对客户跟踪的各种方法,掌握使用HttpSession对象跟踪会话的方法以及使用Cookie技术跟踪会话的方法和了解URL重写和隐藏表单域的方法等,相信掌握了这部分知识对以后的学习也会于很大帮助。
展开阅读全文