Cookie案例练习:
1. 需求:记住上一次访问时间
-
访问一个Servlet,如果是第一次访问,则提示:您好,欢迎您首次访问。
-
如果不是第一次访问,则提示:欢迎回来,您上次访问时间为:显示时间字符串
2. 编码和解码
- Cookie中文字符和特殊字符转成URL编码
package cn.itcast.cookie;
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;
import java.beans.Encoder;
import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* ## 1. 需求:记住上一次访问时间
* <p>
* * 访问一个Servlet,如果是第一次访问,则提示:您好,欢迎您首次访问。
* <p>
* * 如果不是第一次访问,则提示:欢迎回来,您上次访问时间为:显示时间字符串
*/
@WebServlet("/demo")
public class CookieTest extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 设置响应数据内容的格式
resp.setContentType("text/html;charset=utf-8");
// 通过request对象的方法获取Cookie数组
Cookie[] cookies = req.getCookies();
// 创建标识,判断是否有名称为lastTime的Cookie
boolean flag = false;
if (cookies != null && cookies.length > 0) {//如果cookie数组存在并且有值才进行判断
// 遍历cookie数组
for (Cookie cs : cookies) {
if ("lastTime".equals(cs.getName())) {
/* 一、发送新的Cookie */
// 获取当前的时间(美国时间格式)
Date date = new Date();
// 设置时间的格式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
// 按照指定格式将时间转换成字符串
String str_date = sdf.format(date);
System.out.println("编码前:" + str_date);
// 将字符串转换成URL编码
str_date = URLEncoder.encode(str_date, "utf-8");
System.out.println("编码后:" + str_date);
// 更新当前的cookie的值
cs.setValue(str_date);
// 设置Cookie的存活时间
cs.setMaxAge(60 * 60 * 24 * 30);//存活一个月
// 将当前的cookie添加到Cookie会话中,重新发送cookie
resp.addCookie(cs);
/* 二、响应数据 */
// 获取Cookie的值,即上次访问的时间
String lastTime = cs.getValue();
System.out.println("解码前:上次登录的时间" + lastTime);
// URL解码:
lastTime = URLDecoder.decode(lastTime, "utf-8");
System.out.println("解码后:上次登录的时间" + lastTime);
// 在页面中响应数据
resp.getWriter().write("<h1>欢迎回来 " + lastTime + "</h1>");
flag = true;//标记有名称为lastTime的Cookie
break;
}
}
}
// 如果没有找到名称为lastTime的cookie,则是第一次访问
if (flag == false) {
/* 一、第一次发送Cookie */
// 获取当前的时间(美国时间格式)
Date date = new Date();
// 设置时间的格式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
// 按照指定格式将时间转换成字符串
String str_date = sdf.format(date);
System.out.println("编码前:" + str_date);
// 将字符串转换成URL编码
str_date = URLEncoder.encode(str_date, "utf-8");
System.out.println("编码后:" + str_date);
// 更新当前的cookie的值
Cookie cookie = new Cookie("lastTime",str_date);
// 设置Cookie的存活时间
cookie.setMaxAge(60 * 60 * 24 * 30);//存活一个月
// 将当前的cookie添加到Cookie会话中,重新发送cookie
resp.getWriter().write("<h1>欢迎首次访问</h1>");
resp.addCookie(cookie);
}
}
}
输出:
编码前:2021年10月04日 22:29:54
编码后:2021%E5%B9%B410%E6%9C%8804%E6%97%A5+22%3A29%3A54
编码前:2021年10月04日 22:31:45
编码后:2021%E5%B9%B410%E6%9C%8804%E6%97%A5+22%3A31%3A45
解码前:上次登录的时间2021%E5%B9%B410%E6%9C%8804%E6%97%A5+22%3A31%3A45
解码后:上次登录的时间2021年10月04日 22:31:45
编码前:2021年10月04日 22:33:31
编码后:2021%E5%B9%B410%E6%9C%8804%E6%97%A5+22%3A33%3A31
解码前:上次登录的时间2021%E5%B9%B410%E6%9C%8804%E6%97%A5+22%3A33%3A31
解码后:上次登录的时间2021年10月04日 22:33:31
编码前:2021年10月04日 22:33:41
编码后:2021%E5%B9%B410%E6%9C%8804%E6%97%A5+22%3A33%3A41
解码前:上次登录的时间2021%E5%B9%B410%E6%9C%8804%E6%97%A5+22%3A33%3A41
解码后:上次登录的时间2021年10月04日 22:33:41
Session案例练习:
1. 概念:
服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中。HttpSession
2. 快速入门:
- 获取HttpSession对象:
HttpSession session = request.getSession(); - 使用HttpSession对象:
Object getAttribute(String name)
void setAttribute(String name, Object value)
void removeAttribute(String name)
3. 原理
- Session的实现是依赖于Cookie的。
4. 案例需求:
- 访问带有验证码的登录页面login.jsp
- 用户输入用户名,密码以及验证码。
- 如果用户名和密码输入有误,跳转登录页面,提示:用户名或密码错误
- 如果验证码输入有误,跳转登录页面,提示:验证码错误
- 如果全部输入正确,则跳转到主页success.jsp,显示:用户名,欢迎您