JavaWeb笔记_Cookie

一.会话技术概述

在日常生活中,A和B之间在打电话过程中一连串的你问我答就是一个会话

在BS模型中,会话可以理解为通过浏览器访问服务端的资源,点击超链接可以进行资源的跳转,直到浏览器关闭过程叫做会话

我们使用会话技术可以解决的是整个会话过程中(通过浏览器浏览服务端资源过程中)会产生数据保存问题

Request域,ServletContext域在保存会话过程中的数据会导致数据访问的一些问题.(每发送一个请求和响应,就会新建一个request和response对象,很难访问)

二.Cookie

2.1 Cookie概述

Cookie是一种在客户端(浏览器)存储用户会话信息的技术

2.2 Cookie创建和获取

java 复制代码
/**
 * 服务端创建Cookie并发送给浏览器
 *    HttpServletResponse方法:
 *      public void addCookie(Cookie cookie)
 *          将指定 cookie 添加到响应。可多次调用此方法设置一个以上的 cookie。
 *    Cookie类的方法:
 *       构造方法:
 *         public Cookie(String name, String value)
 *                  构造带指定名称和值的 cookie。
 */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.addCookie(new Cookie("username","zs"));
        response.addCookie(new Cookie("username","ls"));
        //新值覆盖老值
        response.addCookie(new Cookie("password","123"));
    }
java 复制代码
/**
 * 获取Cookie中的数据
 *  HttpServletRequest中的方法:
 *     public Cookie[] getCookies()
 *        获取浏览器发送过来的所有Cookie对象,如果没有发送任何 cookie,则此方法返回 null
 *  Cookie中的方法:
 *     String getName()
 *           获取当前Cookie对象中封装的name
 *     String getValue()
 *           获取当前Cookie对象中封装的value
 */
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //请求中会携带着Cookie的数据,所以getCookies()方法在request对象中
        Cookie[] cookies = request.getCookies();
        if (cookies!=null) {
            for (Cookie cookie : cookies) {
                System.out.println(cookie.getName() + "=" + cookie.getValue());
            }
        }else {
            throw new NullPointerException();
        }
    }

2.3 Cookie原理

2.4 Cookie路径

1.Cookie默认设置路径

Cookie会将路径默认设置为请求的服务端路径最后一级路径前面的所有路径

例如:

请求 /day12_CookieAndSession/sendCookie,Cookie的默认路径就是 /day12_CookieAndSession

请求 /day12_CookieAndSession/path01/setCookie,Cookie的默认路径是 /day12_CookieAndSession/path01

2.Cookie不同路径是否携带问题

Cookie的路径:/day12_CookieAndSession/path01

/day12_CookieAndSession/path01/getCookie01 会携带

/day12_CookieAndSession/path01/path02/getCookie02 会携带

/day12_CookieAndSession/getCookie03 不携带

Cookie会在请求跟Cookie相同的路径的Servlet或者该路径下的子级路径的Servlet都会携带 Cookie

如果这个路径既不是Cookie的路径也不是子级路径,那么就不携带这个Cookie

3.设置Cookie的路径

/**

* 手动设置Cookie路径

* public String getPath()

* 手动设置Cookie的路径

*/

java 复制代码
/**
 * 手动设置Cookie路径
 *  public String getPath()
 *      手动设置Cookie的路径
 */
@WebServlet("/path01/setCookie")
public class SetCookie extends HttpServlet {
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		Cookie cookie = new Cookie("gender", "male");
		cookie.setPath(request.getContextPath());
        //同一级的Servlet以及子级的Servlet在发出请求时都会携带cookie
		response.addCookie(cookie);
	}
}
java 复制代码
/**
 * 处理Cookie对象的工具类
 */
public class CookieUtils {
    /**
     *
     * @param name 要查找的Cookie的name
     * @param cookies 存储了浏览器携带的所有cookie对象
     * @return 若找到与name匹配的cookie对象则返回,反之则返回null
     */
    public static Cookie getCookie(String name, Cookie[] cookies) {
        if (cookies != null) {
            for (Cookie cookie : cookies) {
                if (cookie.getName().equals(name)) {
                    return cookie;
                }
            }
        }
        return null; //在cookie数组中没找到所需要的cookie对象或者cookies为null,返回null
    }
}

2.5 Cookie生命周期

2.5.1 概述

1.Cookie的默认最大存活时间在浏览器会话结束前,一旦浏览器会话结束(浏览器关闭),浏览器会自 动删除Cookie

2.手动设置Cookie最大存活时间

public void setMaxAge(int expiry)

设置 cookie 的最大生存时间,以秒为单位。

2.5.2 设置cookie生命周期
java 复制代码
@WebServlet("/setCookieMaxAge")
public class SetCookieMaxAge extends HttpServlet {
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		Cookie cookie = new Cookie("id", "789");
		cookie.setPath(request.getContextPath());
		cookie.setMaxAge(30);//Cookie的最大存活时间30s
		response.addCookie(cookie);
	}
}

2.6 手动删除cookie

java 复制代码
/**
     * public void setMaxAge(int expiry)
     *     将cookie最大存活时间设置成0代表立马删除这个cookie
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Cookie[] cookies = request.getCookies();
        for (Cookie cookie : cookies) {
            cookie.setMaxAge(0);
            response.addCookie(cookie);
            System.out.println("delete success");
        }
        /**
         * 1.服务器端检索到请求中的Cookie。
         * 2.服务器端调用setMaxAge(0)方法,将Cookie的生命周期设置为立即过期。
         * 3.服务器端将修改后的Cookie通过response.addCookie(cookie)发送到客户端。
         * 4.客户端浏览器接收到响应,根据Set-Cookie头中的指令删除该Cookie。
         */
    }

2.7 cookie案例

java 复制代码
//获取上一次访问该网页的时间    
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        Cookie cookie = CookieUtils.getCookie("date", request.getCookies());
        if (cookie == null) {
            //如果cookie为空,说明为第一次访问
            response.getWriter().write("这是您第一次访问");
        } else {
            String oldDate = cookie.getValue();
            //cookie不为空时,访问cookie的value值,由于传递过来的是UTF-8格式的数据,所以需要进行解码
            String newDate = URLDecoder.decode(oldDate, "UTF-8");
            response.getWriter().write("您上次的访问时间为" + newDate);
        }
        //无论if还是else,最终都要对日期进行更新
        String date = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(LocalDateTime.now());
        //因为date中包含空格等特殊字符,所以先将date编码为UTF-8格式传递给浏览器
        String newDate = URLEncoder.encode(date, "UTF-8");
        response.addCookie(new Cookie("date", newDate));
    }
}
相关推荐
卸任5 小时前
Vibe coding工具使用心得
前端·ai编程
brien96 小时前
为什么模型标称 1M,Google Antigravity 聊到 256K 却突然失忆?我们给它做了个原生行内监控圆环
前端
修炼的dance6 小时前
录屏关键帧间隔多少合适?六档实测,2秒到10秒小了75.6%
前端
Lank_M7 小时前
关键帧从1秒拉到10秒,录屏小87.3%,摄像头小10.8%
前端
补码缩写7 小时前
用 ffprobe 拆录屏,八成字节在 29 个关键帧上
前端
百思不得小李7 小时前
一个复杂的动态表单是如何实现的
前端·设计模式
陈随易7 小时前
Cmder 停更 17 个月,2.0 支持 Windows Terminal
前端·后端·程序员
风骏时光牛马7 小时前
前沿视界
前端
kyriewen7 小时前
我扫了 814 个依赖,97 个还敢要 Node 10
前端·javascript·程序员
陈随易7 小时前
3000 万人在用的翻译插件,重写一遍就是一门生意
前端·后端·程序员