JavaWeb笔记_Cookie

news2024/9/20 10:56:35

一.会话技术概述

在日常生活中,A和B之间在打电话过程中一连串的你问我答就是一个会话
   在BS模型中,会话可以理解为通过浏览器访问服务端的资源,点击超链接可以进行资源的跳转,直到浏览器关闭过程叫做会话
   我们使用会话技术可以解决的是整个会话过程中(通过浏览器浏览服务端资源过程中)会产生数据保存问题

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

二.Cookie

2.1 Cookie概述

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

2.2 Cookie创建和获取

/**
 * 服务端创建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"));
    }
/**
 * 获取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的路径
     */

/**
 * 手动设置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);
	}
}
/**
 * 处理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生命周期
@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

/**
     * 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案例

//获取上一次访问该网页的时间    
    @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));
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1939324.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux】一文向您详细介绍 Vim编辑器 显示行号的方法

【Linux】一文向您详细介绍 Vim编辑器 显示行号的方法 下滑即可查看博客内容 🌈 欢迎莅临我的个人主页 👈这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地!🎇 🎓 博主简介:985高校的普通本…

【Matlab】PLS偏最小二乘法回归预测算法(附代码)

资源下载: 资源合集: 目录 一,概述 偏最小二乘法是一种新型的多元统计数据分析方法,于1983年由S.Wold和C.Albano等人首次提出。偏最小二乘法实现了,在一个算法下,可以同时实现回归建模(多元线…

类和对象:赋值函数

1.运算符重载 • 当运算符被⽤于类类型的对象时,C语⾔允许我们通过运算符重载的形式指定新的含义。C规定类类型对象使⽤运算符时,必须转换成调⽤对应运算符重载,若没有对应的运算符重载,则会编译报错;(运算…

SwiftUI 5.0(iOS 17)滚动视图的滚动目标行为(Target Behavior)解惑和实战

概览 在 SwiftUI 的开发过程中我们常说:“屏幕不够,滚动来凑”。可见滚动视图对于超长内容的呈现有着多么秉轴持钧的重要作用。 这不,从 SwiftUI 5.0(iOS 17)开始苹果又为滚动视图增加了全新的功能。但是官方的示例可…

【LeetCode】80.删除有序数组中的重复项II

1. 题目 2. 分析 3. 代码 class Solution:def removeDuplicates(self, nums: List[int]) -> int:if len(nums) < 3:return len(nums)i 0j 1k 2while(k < len(nums)):if (nums[i] nums[j]):while(k < len(nums) and nums[j] nums[k] ):k1if (k < len(nums…

C语言指针超详解——最终篇一

C语言指针系列文章目录 入门篇 强化篇 进阶篇 最终篇一 文章目录 C语言指针系列文章目录1. 回调函数是什么2. qsort 函数2.1 概念2.2 qsort 排序 int 类型数据2.3 使用 qsort 排序结构体数据 3. 模拟实现 qsort 函数4. sizeof 与 strlen 的对比4.1 sizeof4.2 strlen4.3 sizeof…

ctf中php反序列化汇总

序列化与反序列化的概念 序列化就是将对象转换成字符串。字符串包括 属性名 属性值 属性类型和该对象对应的类名。 反序列化则相反将字符串重新恢复成对象。 对象的序列化利于对象的保存和传输,也可以让多个文件共享对象。 序列化举例&#xff1a;一般ctf题目中我们就是要将对…

02设置burpsuite代理

在日常工作之中&#xff0c;我们最常用的web客服端就是web浏览器&#xff0c;我们可以通过代理的设置&#xff0c;做到web浏览器的流量拦截&#xff0c;并且经过burpsuite代理的数据流量进行处理。 在火狐浏览器中安装foxyporxy

哥德尔不完备定理(Godel‘s Incompleteness Theorem) —— 奠定了计算机与 AI 的理论基础

哥德尔不完备定理 在数理逻辑中&#xff0c;哥德尔不完备定理是指库尔特・哥德尔于 1931 年证明并发表的两条定理。简单地说&#xff0c;第一条定理指出&#xff1a;任何相容的形式系统&#xff0c;只要蕴涵皮亚诺算术公理&#xff0c;就可以在其中构造在体系中既不能证明也不…

Java GC(垃圾回收)机制详解

Java GC&#xff08;垃圾回收&#xff09;机制详解 1、GC触发的条件2、GCRoots的对象类型 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在Java的世界里&#xff0c;内存管理是自动进行的&#xff0c;其中垃圾回收&#xff08;Garbage Col…

WDL(Wide Deep Learning for Recommender Systems)——Google经典CTR预估模型

一、文章简介 Wide & Deep Learning for Recommender Systems这篇文章介绍了一种结合宽线性模型和深度神经网络的方法&#xff0c;以实现推荐系统中的记忆和泛化。这种方法在Google Play商店的应用推荐系统中进行了评估&#xff0c;展示了其显著的性能提升。 推荐系统中的…

解决使用腾讯地图没超过额度却一直报“此key每日调用量已达到上限”

1、个人开发者配额说明 2、需要在 配额管理 的 账户额度 中进行配额的分配即可。 3、开发工具接口的调用就不会出现该报错了

【专项刷题】— 快排

1、颜色分类 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 创建三个指针&#xff0c;然后把数组分为三个区域遍历代码&#xff1a; class Solution {public void swap(int[] nums, int i, int j){int t nums[i];nums[i] nums[j];nums[j] t;}public void sortCo…

如何快速开发一个简单的企业信息系统?O2OA手把手带你,高效开发!(附源码)

前言 想象一下&#xff0c;如果你的企业能够通过一个系统快速发布企业信息&#xff0c;员工们无论身在何处都能即时获取新信息&#xff0c;那该多好&#xff01;告别email轰炸和口头传达的低效&#xff0c;O2OA企业应用开发平台让这一切变得简单。 今天&#xff0c;就让我们一…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 二进制游戏(200分)- 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 🍿 最新华为OD机试D卷目录,全、新、准,题目覆盖率达 95% 以上,支持题目在线…

CCF-Csp算法能力认证, 202312-2因子化简含解析

CCF-Csp算法能力认证&#xff0c; 202312-1仓库规划含解析 前言 推荐书目&#xff0c;在这里推荐那一本《算法笔记》&#xff08;胡明&#xff09;&#xff0c;需要PDF的话&#xff0c;链接如下 「链接&#xff1a;https://pan.xunlei.com/s/VNvz4BUFYqnx8kJ4BI4v1ywPA1?…

Java(九)——抽象类、抽象方法

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 ⚡开源项目&#xff1a; rich-vue3 &#xff08;基于 Vue3 TS Pinia Element Plus Spring全家桶 MySQL&#xff09; &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1…

Synchronized升级到重量级锁会发生什么?

我们从网上看到很多&#xff0c;升级到重量锁的时候不会降级&#xff0c;再来线程都是重量级锁 今天我们来实验一把真的是这样的吗 1.首选导入Java对象内存布局的工具库&#xff1a; <dependency><groupId>org.openjdk.jol</groupId><artifactId>jol-…

django-vue-admin项目运行

文本主要对django-vue-admin项目进行了简要介绍&#xff0c;并且对前后端进行了源码安装和运行。在此基础上可作为管理系统二次开发的基础框架。 一.django-vue-admin简介和安装 1.简介 django-vue-admin项目是基于RBAC模型权限控制的中小型应用的基础开发平台&#xff0c;采…

hung 之 Android llkd

目录 1. llkd 简介 2. 原理 2.1 内核活锁 2.2 检测机制 2.3 为什么 persistent stack signature 检测机制不执行 ABA 检查&#xff1f; 2.4 为什么 kill 进程后&#xff0c;进程还存在就能判定发生了内核 live-lock&#xff1f; 3. 代码 3.1 内核 live-lock 检查 3.2 …