实验九 Cookie
需要资料,详见文章末尾,主打一个免费自提
一、实验目的:
1、理解Cookie的工作原理。
2、掌握操作Cookie的常见API。
二、 实验内容:
1、请在【代码一】~【代码四】
中填写正确的代码,实现用户的7天免登录功能。
(1)登录页面:
(2)如果登录失败,则在页面中显示“用户名或者密码错误”。
(3)如果登录成功,且选中“七天内免登录”复选框,则会将当前用户的用户名以及密码保存到本地Cookie中,在七天内访问登录页面时,用户名及密码会自动显示在文本框中;如果登录成功,但未选中“七天内免登录”复选框,则会清除cookie中已有的用户名及密码。
【实验步骤】:
(1)新建一个名为”web9”的项目(Web应用程序)。在项目中,新建JSP,命名为“login”。
<%@page contentType="text/html" pageEncoding="UTF-8" session="false"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
<body>
<%
String username = "";
String userpass = "";
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (int i = 0; i < cookies.length; i++) {
if ("username".equals(cookies[i].getName())) {
username = cookies[i].getValue();
}
if ("userpass".equals(cookies[i].getName())) {
//【代码一】
}
}
}
%>
<form action="<%=request.getContextPath()%>/login" method="post">
username:<input type="text" name="username" value="<%=username%>"/><br>
password:<input type="password" name="userpass" value="<%=userpass%>"/><br>
<input type="checkbox" value="y" name="isLogin" checked>七天内免登录<br>
<input type="submit" value="登录"/>
</form>
</body>
</html>
(3)新建java包“it.servlet”。在该包中新建java类,命名为“LoginServlet”。
LoginServlet.java的功能:实现用户登录的判断以及7天免登录。
package it.servlet;
import java.io.IOException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.*;
import javax.servlet.http.*;
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//【代码二】
String username = req.getParameter("username");
String userpass = req.getParameter("userpass");
String isLogin = req.getParameter("isLogin");//选中“七天内免登录”,则isLogin返回“y”;否则,返回null
if ("admin".equals(username) && "123456".equals(userpass)) {
resp.getWriter().println("登录成功");
if ("y".equals(isLogin)) {
//不能写成 isLogin.equals("y")
Cookie usernameCookie = new Cookie("username", username);
usernameCookie.setMaxAge(3600 * 24 * 7);
Cookie userpassCookie = new Cookie("userpass", userpass);
userpassCookie.setMaxAge(3600 * 24 * 7);
//【代码三】
} else {
//【代码四】
}
} else {
resp.getWriter().println("用户名或密码错误");
}
}
}
2、请在【代码一】~【代码四】
中填写正确的代码,显示用户浏览过的商品名称。
【实验步骤】
(1)在项目中新建“JSP”文件,命名为“display”。
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
<h3>商品列表</h3>
<a href="<%=request.getContextPath()%>/display?name=ThinkPad">ThinkPad</a><br/>
<a href="<%=request.getContextPath()%>/display?name=Lenovo">Lenovo</a><br/>
<a href="<%=request.getContextPath()%>/display?name=Apple">Apple</a><br/>
<a href="<%=request.getContextPath()%>/display?name=Sony">Sony</a><br/>
<a href="<%=request.getContextPath()%>/display?name=Dell">Dell</a><br/>
<a href="<%=request.getContextPath()%>/display?name=ACER">ACER</a><br/>
<h3>浏览过的商品</h3>
<%
/*【代码一】从Cookie中读取名为“goods”的值,URLDecoder解码后显示在页面中 */
%>
</body>
</html>
(3)在it.servlet包中新建java类,命名为“DisplayServlet”。 DisplayServlet.java的功能:将用户点击的商品名添加到cookie中。
package it.servlet;
import java.io.IOException;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
@WebServlet("/display")
public class DisplayServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//【代码二】声明并初始化变量goods
//读取cookie
Cookie[] cookies = req.getCookies();
if (cookies != null) {
for (Cookie c : cookies) {
if ("goods".equals(c.getName())) {
goods = URLDecoder.decode(c.getValue(),"utf-8");
break;
}
}
}
//【代码三】从请求对象中,获取被点击的商品名,赋值给name
//判断goods中是否包含被点击的商品名。若不包含,则将商品名添加到goods中。
if (!goods.contains(name)) {
goods = name +" "+goods; //用空格分隔不同的商品名
}
//【代码四】将goods进行URLEncoder编码后,存储到客户端浏览器的cookie中
resp.sendRedirect(req.getContextPath() + "/display.jsp");
}
}
三、具体实现
1、实现用户的7天免登录功能
<%@page contentType="text/html" pageEncoding="UTF-8" session="false"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
<body>
<%
String username = "";
String userpass = "";
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (int i = 0; i < cookies.length; i++) {
if ("username".equals(cookies[i].getName())) {
username = cookies[i].getValue();
}
if ("userpass".equals(cookies[i].getName())) {
userpass = cookies[i].getValue();//【代码一】
}
}
}
%>
<form action="<%=request.getContextPath()%>/login" method="post">
username:<input type="text" name="username" value="<%=username%>"/><br>
password:<input type="password" name="userpass" value="<%=userpass%>"/><br>
<input type="checkbox" value="y" name="isLogin" checked>七天内免登录<br>
<input type="submit" value="登录"/>
</form>
</body>
</html>
package it.servlet;
import java.io.IOException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.*;
import javax.servlet.http.*;
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//【代码二】
// 设置响应的内容类型为 "text/html",表示返回给客户端的内容是 HTML 格式的。
// charset=UTF-8 部分指定了 HTML 内容的字符编码是 UTF-8。
resp.setContentType("text/html;charset=UTF-8");
// 设置响应的字符编码为 UTF-8
// 确保它能够被浏览器正确解释和显示
resp.setCharacterEncoding("UTF-8");
String username = req.getParameter("username");
String userpass = req.getParameter("userpass");
String isLogin = req.getParameter("isLogin");//选中“七天内免登录”,则isLogin返回“y”;否则,返回null
if ("admin".equals(username) && "123456".equals(userpass)) {
resp.getWriter().println("登录成功");
if ("y".equals(isLogin)) {
//不能写成 isLogin.equals("y") 避免空指针异常
Cookie usernameCookie = new Cookie("username", username);
usernameCookie.setMaxAge(3600 * 24 * 7);
Cookie userpassCookie = new Cookie("userpass", userpass);
userpassCookie.setMaxAge(3600 * 24 * 7);
//【代码三】
resp.addCookie(usernameCookie);
resp.addCookie(userpassCookie);
} else {
//【代码四】
Cookie usernameCookie = new Cookie("username", "");
usernameCookie.setMaxAge(0);
resp.addCookie(usernameCookie);
Cookie userpassCookie = new Cookie("userpass", "");
userpassCookie.setMaxAge(0);
resp.addCookie(userpassCookie);
}
} else {
resp.getWriter().println("用户名或密码错误");
}
}
}
2、实现显示用户浏览过的商品名称
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
<h3>商品列表</h3>
<a href="<%=request.getContextPath()%>/display?name=ThinkPad">ThinkPad</a><br/>
<a href="<%=request.getContextPath()%>/display?name=Lenovo">Lenovo</a><br/>
<a href="<%=request.getContextPath()%>/display?name=Apple">Apple</a><br/>
<a href="<%=request.getContextPath()%>/display?name=Sony">Sony</a><br/>
<a href="<%=request.getContextPath()%>/display?name=Dell">Dell</a><br/>
<a href="<%=request.getContextPath()%>/display?name=ACER">ACER</a><br/>
<h3>浏览过的商品</h3>
<%
/*【代码一】从Cookie中读取名为“goods”的值,URLDecoder解码后显示在页面中 */
String goods = "";
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie c: cookies) {
if ("goods".equals(c.getName())){
goods = URLDecoder.decode(c.getValue(),"UTF-8");
break;
}
}
}
%>
<%= goods %>
</body>
</html>
package it.servlet;
import java.io.IOException;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
@WebServlet("/display")
public class DisplayServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//【代码二】声明并初始化变量goods
String goods = "";
//读取cookie
Cookie[] cookies = req.getCookies();
if (cookies != null) {
for (Cookie c : cookies) {
if ("goods".equals(c.getName())) {
goods = URLDecoder.decode(c.getValue(),"utf-8");
break;
}
}
}
//【代码三】从请求对象中,获取被点击的商品名,赋值给name
String name = req.getParameter("name");
//判断goods中是否包含被点击的商品名。若不包含,则将商品名添加到goods中。
if (!goods.contains(name)) {
goods = name +" "+goods; //用空格分隔不同的商品名
}
//【代码四】将goods进行URLEncoder编码后,存储到客户端浏览器的cookie中
Cookie goodsCookie = new Cookie("goods", URLEncoder.encode(goods, "utf-8"));
resp.addCookie(goodsCookie);
resp.sendRedirect(req.getContextPath() + "/display.jsp");
}
}
四、资料自提(若过期,请私信)
链接:https://pan.baidu.com/s/1gGdqLeZmlmWBqXrW-pyX7Q?pwd=sdiq
提取码:sdiq