实验五 Cookie和Session的使用
一、实验目的
1. 熟练使用Cookie;
2. 熟练使用Session。
二、实验内容
1. 使用Cookie实现,用户第一次访问LastAccessServlet的时候,页面显示“你是首次访问本网站,当前时间为:xxx”,第n次访问时显示“欢迎回来,您上次访问时间为:xxxx”;
2. 当用户访问网站首页时,会先判断用户是否登录,如果已登录,则在首页显示用户信息,否则进入登录页面,实现用户登录功能,编写login.html文件实现用户登录页面,该页面包含用户登录表单信息,包括用户名和密码等,在登录后,如果点击登录界面的“退出”,就会注销当前用户信息,返回首页。
三、实验结果(源代码、运行截图)
LastAccessServlet.java
package xxx;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//@WebServlet("/lastAccess")
public class LastAccessServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
// 判断是否是第一次访问,从指定的cookie数组,获取指定名称的cookie
// 获取从浏览器带过来的所有cookie
Cookie[] cookies = req.getCookies();
// 从数组中找到指定名称的cookie,利用CookieUtils工具类
Cookie cookie = CookieUtils.findCookie(cookies, "lastVisit");
// 判断是否是第一次访问
if (cookie == null) {
// 是第一次访问
// 显示到页面上一段内容
res.setContentType("text/html;charset=UTF-8");
Date d1 = new Date();
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy年MM月dd日HH时mm分ss秒");
String s1 = sdf1.format(d1);
res.getWriter().print("<h1>你是首次访问本网站,当前时间为:"+s1+"</h1>");
} else {
// 不是第一次访问
// 获得cookie中的上一次访问时间,显示到页面上
//String getValue():获取此 Cookie 的当前值。
String value = cookie.getValue();
// 显示到页面上一段内容
res.setContentType("text/html;charset=UTF-8");
res.getWriter().print("<h1>欢迎回来,您上次访问时间为:" + value + "</h1>");
}
// 记录当前系统时间到cookie,回写到浏览器
Date d = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日HH时mm分ss秒");
String s = sdf.format(d);
// 存入到cookie
Cookie c = new Cookie("lastVisit", s);
// 回写到浏览器
res.addCookie(c);
// 设置响应内容类型为HTML
res.setContentType("text/html");
// 获取PrintWriter对象以写入响应体
PrintWriter out = res.getWriter();
// 写入HTML内容到响应体
out.println("<!DOCTYPE html>");
out.println("<html>");
out.println("<head>");
out.println("<title>点击</title>");
out.print("<a href='index.jsp'>");
out.println("<title>返回主页</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>点击这里返回登录界面</h1>");
out.println("</body>");
out.println("</html>");
// 刷新输出流并关闭
out.flush();
out.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
doGet(req, res);
}
}
CookieUtils.java
package xxx;
import javax.servlet.http.Cookie;
public class CookieUtils {
public static Cookie findCookie(Cookie[] cookies, String name) {
if (cookies == null) {
// 浏览器没有携带Cookie
return null;
} else {
for (Cookie cookie : cookies) {
// 判断cookie是否是我们想要的那个cookie
// public String getName():返回 Cookie 的名称。创建后无法更改名称。
if (cookie.getName().equals(name)) {
// 直接返回cookie
return cookie;
}
}
// 浏览器带有Cookie,但是没有指定名称的那个Cookie
return null;
}
}
}
LoginServlet.java
package xxx;
import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
//@WebServlet("/login")
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
String username = request.getParameter("username");
String password = request.getParameter("password");
ServletConfig config=this.getServletConfig();
String right= config.getInitParameter("账号"); // 假设name是用于验证的用户名
String right2 = config.getInitParameter("密码"); // 假设password是用于验证的密码
if (right.equals(username) && right2.equals(password)) {
// 登录成功,将用户信息保存到session中
HttpSession session = request.getSession();
session.setAttribute("username", username);
//response.sendRedirect("index.jsp"); // 重定向到首页
response.sendRedirect("lastAccess");
} else {
// 登录失败,重定向回登录页面
response.sendRedirect("login.html");
}
}
}
LogoutServlet.java
package xxx;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
public class LogoutServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//获取Cookies数组
Cookie[] cookies = request.getCookies();
// 迭代查找并清除Cookie
for (Cookie cookie: cookies) {
if ("lastVisit".equals(cookie.getName())) {
cookie.setMaxAge(0);
response.addCookie(cookie);
}
}
// 销毁Session
request.getSession().invalidate();
// 重定向
response.sendRedirect("index.jsp");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>LastAccessServlet</servlet-name>
<servlet-class>xxx.LastAccessServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LastAccessServlet</servlet-name>
<url-pattern>/lastAccess</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>xxx.LoginServlet</servlet-class>
<init-param>
<param-name>账号</param-name>
<param-value>xxx</param-value>
</init-param>
<init-param>
<param-name>密码</param-name>
<param-value>2022</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>LogoutServlet</servlet-name>
<servlet-class>xxx.LogoutServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LogoutServlet</servlet-name>
<url-pattern>/logout</url-pattern>
</servlet-mapping>
</web-app>
index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Home Page</title>
</head>
<body>
<%
// 获取session中的用户信息
String username = (String) session.getAttribute("username");
if (username != null) {
// 用户已登录,显示用户信息
out.println("欢迎, " + username + "!点击这里<a href='login.html'>重新登录</a>");
} else {
// 用户未登录,显示登录链接
out.println("请点击 <a href='login.html'>登录</a> 登录您的账号.");
}
%>
</body>
</html>
login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Login Page</title>
</head>
<body>
<form action="login" method="post">
<label for="username">用户名:</label>
<input type="text" id="username" name="username" required>
<label for="password">密码:</label>
<input type="password" id="password" name="password" required>
<input type="submit" value="登录">
</form>
<p>点击这里<a href="logout"> 退出 </a></p>
</body>
</html>