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));
    }
}
相关推荐
乔峰不是张无忌33015 分钟前
【HTML】动态闪烁圣诞树+雪花+音效
前端·javascript·html·圣诞树
鸿蒙自习室22 分钟前
鸿蒙UI开发——组件滤镜效果
开发语言·前端·javascript
m0_7482507429 分钟前
高性能Web网关:OpenResty 基础讲解
前端·openresty
前端没钱1 小时前
从 Vue 迈向 React:平滑过渡与关键注意点全解析
前端·vue.js·react.js
NoneCoder1 小时前
CSS系列(29)-- Scroll Snap详解
前端·css
无言非影1 小时前
vtie项目中使用到了TailwindCSS,如何打包成一个单独的CSS文件(优化、压缩)
前端·css
我曾经是个程序员1 小时前
鸿蒙学习记录
开发语言·前端·javascript
zhou周大哥2 小时前
linux 安装 ffmpeg 视频转换
linux·运维·服务器
羊小猪~~2 小时前
前端入门之VUE--ajax、vuex、router,最后的前端总结
前端·javascript·css·vue.js·vscode·ajax·html5
Hejjon2 小时前
SpringBoot 整合 SQLite 数据库
笔记