Cookie学习笔记 2021-10-05

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);
        }
    }
}

输出:

编码前:2021100422:29:54
编码后:2021%E5%B9%B410%E6%9C%8804%E6%97%A5+22%3A29%3A54
编码前:2021100422: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
解码后:上次登录的时间2021100422:31:45
编码前:2021100422: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
解码后:上次登录的时间2021100422:33:31
编码前:2021100422: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
解码后:上次登录的时间2021100422:33:41

Session案例练习:

1. 概念:

服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中。HttpSession

2. 快速入门:

  1. 获取HttpSession对象:
    HttpSession session = request.getSession();
  2. 使用HttpSession对象:
    Object getAttribute(String name)
    void setAttribute(String name, Object value)
    void removeAttribute(String name)

3. 原理

  • Session的实现是依赖于Cookie的。

4. 案例需求:

  1. 访问带有验证码的登录页面login.jsp
  2. 用户输入用户名,密码以及验证码。
  • 如果用户名和密码输入有误,跳转登录页面,提示:用户名或密码错误
  • 如果验证码输入有误,跳转登录页面,提示:验证码错误
  • 如果全部输入正确,则跳转到主页success.jsp,显示:用户名,欢迎您
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值