【JavaEE】_Spring MVC项目获取Cookie

news2024/11/15 21:29:34

目录

1. Cookie与Session基础知识

1.1 Cookie与Session的区别

2. 使用servlet原生方法获取Cookie

2.2 关于λ表达式遍历法的空指针问题

2.3 Cookie的伪造

3. 使用Spring注解获取Cookie

3.1 获取单个Cookie

3.2 获取多个Cookie


1. Cookie与Session基础知识

在本专栏HTTP请求与响应部分已经提到过关于报头Cookie的基本知识,原文链接如下:

【JavaEE】_HTTP请求报头header-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/m0_63299495/article/details/136140202此处仅作以简单概括:

1. HTTP是无状态的,即没有记忆功能。

无状态的含义是:默认情况下HTTP协议的客户端和服务器之间的这次通信和下次通信之间没有直接的联系。

无论请求的时机如何,只要请求的参数相同,其处理的逻辑是一样的(不是数据一样),得到的结果也是一样的。

2. 但在实际开发中,有时需要明确请求与请求之间的联系,比如登录过后,第二次登录时服务器就知道该客户端是否已经登录过了;

Cookie与Session就是用于实现部分内容的记忆。

1.1 Cookie与Session的区别

(1)Cookie客户端保存用户信息的一种机制,Session服务器保存用户信息的一种机制;

(2)Cookie和Session之间主要是通过SessionId关联起来的,SessionId是Cookie和Session之间的桥梁;

(3)Cookie和Session经常会在一起配合使用,但并不是必须配合:

① 完全可以用Cookie来保存一些数据在客户端,这些数据不一定是用户身份信息,也不一定是SessionId;

② Session中的sessionId也不需要非得通过Cookie / Set-Cookie传递,比如通过URL传递;

2. 使用servlet原生方法获取Cookie

package com.example.demo.controller;

import com.example.demo.Person;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;

@RequestMapping("/Para")
@RestController
public class ParaController {
    @RequestMapping("/getCookie")
    public String getCookie(HttpServletRequest request, HttpServletResponse response){
        Cookie[] cookies = request.getCookies();   //获取Cookie对象
        for (Cookie cookie : cookies) {
            System.out.println(cookie.getName()+": "+cookie.getValue());
        }
    }
}

注:HttpServletRequest和HttpServletResponse在Servlet部分也曾使用过,Spring是基于Servlet实现的。

HttpServletRequest和HttpServletResponse是Spring的内置对象,需要使用时加上声明即可

2.2 关于λ表达式遍历法的空指针问题

对于遍历Cookies逐个获取到cookie对象时,可以使用λ表达式:

    @RequestMapping("getCookie")
    public String getCookie(HttpServletRequest request, HttpServletResponse response){
        Arrays.stream(cookies).forEach(cookie->{
            System.out.println(cookie.getName()+": "+cookie.getValue());
        });
        return "Cookies accepted successfully";
    }

现使用浏览器构造HTTP请求访问:

可见错误码500,表示服务器内部错误;

查看服务器日志:

对应修改75行代码消除空指针异常:

    @RequestMapping("/getCookie")
    public String getCookie(HttpServletRequest request, HttpServletResponse response){
        Cookie[] cookies = request.getCookies();   //获取Cookie对象
        if(cookies != null){
            Arrays.stream(cookies).forEach(cookie->{
                System.out.println(cookie.getName()+": "+cookie.getValue());
            });
        }
        return "Cookies accepted successfully";
    }

此时再重新启动,使用浏览器访问:

可见此时服务器接收cookie成功,只是由于当前cookie为空,故而没有显示cookie内容;

2.3 Cookie的伪造

在Chrome页面按F12调出控制台,进行如下操作:

此时刷新浏览器页面,回到服务器端查看服务器日志:

3. 使用Spring注解获取Cookie

1. 使用Spring获取Cookie需要使用注解@CookieValue

2. 注意Cookie是客户端保存信息的机制,与浏览器有关。

重启服务器后,在上例中设置的cookie仍然存在;

3.1 获取单个Cookie

.java文件内容如下:

package com.example.demo.controller;

import com.example.demo.Person;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;

@RequestMapping("/Para")
@RestController
public class ParaController {
    @RequestMapping("/getCookie2")
    public String getCookie(@CookieValue String aaa){
        return "CookieName: aaa "+
                "CookieValue: "+ aaa;
    }
}

重新启动服务器,根据URL访问,客户端页面如下:

可见Cookie获取成功;

3.2 获取多个Cookie

.java文件内方法修改如下:

    @RequestMapping("/getCookie2")
    public String getCookie(@CookieValue String aaa, @CookieValue String bbbb){
        return "CookieName: aaa "+
                "CookieValue: "+ aaa+"\n"+
                "CookieName: bbbb "+
                "CookieValue: "+ bbbb;
    }

重新启动运行并刷新浏览器:

 

注意在使用Servlet原生方法获取cookie时,获取到的是所有的cookie

使用spring注解@CookieValue获取cookie,只能逐个获取cookie

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

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

相关文章

【随笔】Git 高级篇 -- 整理提交记录(上)cherry-pick(十五)

💌 所属专栏:【Git】 😀 作  者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! 💖 欢迎大…

docker-compose安装adguard给局域网提供dns加速服务

启动配置 docker-compose.yaml配置文件 version: 3.3 services:adguard:image: adguard/adguardhome:latestcontainer_name: adguardrestart: unless-stoppedvolumes:- ./workdir:/opt/adguardhome/work- ./confdir:/opt/adguardhome/confports:- 53:53/tcp- 53:53/udp- 81:8…

【fdisk 相关分区命令记录】

目的 记录下新磁盘下刚刚分配的系统(安装系统后未操作或者新扩容的)的分区格式化及挂载,比如这里运维分配了100G 步骤: 1.查看新硬盘 lsblk -f查看,sdb就是新分配的硬盘,无任何相关的属性信息 2、分区明细查看 fd…

鸿蒙内核源码分析 (双向链表篇) | 谁是内核最重要结构体

双向链表是什么&#xff1f; 谁是鸿蒙内核最重要的结构体 &#xff1f; 一定是: LOS_DL_LIST(双向链表)&#xff0c; 它长这样。 typedef struct LOS_DL_LIST {struct LOS_DL_LIST *pstPrev; /**< Current nodes pointer to the previous node | 前驱节点(左手)*/struct L…

ZYNQ学习Linux 基础外设的使用

基本都是摘抄正点原子的文章&#xff1a;《领航者 ZYNQ 之嵌入式Linux 开发指南 V3.2.pdf》&#xff0c;因初次学习&#xff0c;仅作学习摘录之用&#xff0c;有不懂之处后续会继续更新~ 工程的创建参考&#xff1a;《ZYNQ学习之Petalinux 设计流程实战》 一、GPIO 之 LED 的使…

Open CASCADE学习|旋转变换

物体在三维空间中的旋转变换操作通常可以通过三种不同的方式来表示&#xff1a;矩阵&#xff08;Matrix&#xff09;、欧拉角&#xff08;Euler Angles&#xff09;和四元数&#xff08;Quaternion&#xff09;。下面详细解释这三种表示方法。 矩阵&#xff08;Matrix&#xf…

SpringCloud学习(10)-SpringCloudAlibaba-Nacos服务注册、配置中心

Spring Cloud Alibaba 参考文档 Spring Cloud Alibaba 参考文档 nacos下载Nacos 快速开始 直接进入bin包 运行cmd命令&#xff1a;startup.cmd -m standalone 运行成功后通过http://localhost:8848/nacos进入nacos可视化页面&#xff0c;账号密码默认都是nacos Nacos服务注…

全景化工厂虚拟场景VR在线编辑突破传统束缚

数字化时代来临&#xff0c;让很多行业发生了天翻地覆的变化&#xff0c;更多人和企业接纳和亲近VR/AI/3D等技术&#xff0c;虚拟仿真VR内容编辑器系统不仅在畜牧培训领域大放异彩&#xff0c;更在其他多个行业领域展现出广泛的应用前景。 相比传统的VR虚拟现实应用程序开发依赖…

如何使用开源情报跟踪一个人?在线访问网站以及使用方法介绍

如何使用开源情报跟踪一个人&#xff1f;在线访问网站以及使用方法介绍。 开源情报&#xff08;OSINT&#xff09;是一门关于收集和分析公开可用信息的独特技艺&#xff0c;它致力于构建个人或团体的详尽档案。 这一过程中&#xff0c;信息搜集者会利用多元化的信息源&#xff…

如何使用 langchain 与 openAI 连接

上一篇写了如何安装 langchain https://www.cnblogs.com/hailexuexi/p/18087602 这里主要说一个 langchain的使用 创建一个目录 langchain &#xff0c;在这个目录下创建两个文件 main.py 这段python代码&#xff0c;用到了openAI&#xff0c;需要openAI及FQ。这里只做…

【NLP】隐马尔可夫(HMM)与条件随机场(CRF)简介

一. HMM 隐马尔可夫模型&#xff08;Hidden Markov Model, HMM&#xff09;是一种用于处理含有隐藏状态的序列数据的统计学习模型。通过建模隐藏状态之间的转移关系以及隐藏状态与观测数据的生成关系&#xff0c;HMM能够在仅观察到部分信息的情况下进行状态推理、概率计算、序…

Spring Security——06,授权_封装权限信息

授权_封装权限信息 一、权限系统的作用二、授权基本流程三、限制访问资源所需权限四、封装权限信息4.1 权限信息封装到LoginUser4.2 LoginUser 添加权限4.3 过滤器封装权限信息 五、断点测试5.1 有权限的访问5.2 没有权限的访问 一键三连有没有捏~~ 一、权限系统的作用 例如一…

数据结构(3)----栈和队列

目录 一.栈 1.栈的基本概念 2.栈的基本操作 3.顺序栈的实现 •顺序栈的定义 •顺序栈的初始化 •进栈操作 •出栈操作 •读栈顶元素操作 •若使用另一种方式: 4.链栈的实现 •链栈的进栈操作 •链栈的出栈操作 •读栈顶元素 二.队列 1.队列的基本概念 2.队列的基…

物联网实战--驱动篇之(三)LoRa(sx1278)

目录 一、LoRa简介 二、sx1278模块 三、硬件抽象层 四、SX1278初始化 五、发送时间计算 六、发送模式 七、接收模式 八、总结 一、LoRa简介 LoRa在物联网传输领域有着举足轻重的地位&#xff0c;平时大家可能比较少听说&#xff0c;因为它主要还是在行业应用&#xff0…

精心整理-数据分类分级赋能企业数据安全建设资料合集

以下是资料目录&#xff0c;如需下载请前往知识星球下载&#xff1a;https://t.zsxq.com/18KTZnJMX 企业数据安全建设数据分类分级架构.pdf 企业数据分类分级模板.xls 数据分类分级的实践与挑战.pdf 数据分类分级制度评述.pdf 电信和互联网大数据安全管控分类分级实施指南.pdf …

嵌入式学习49-单片机2

指令周期 1M 机器周期 12M &#xff08;晶体震荡器产生&#xff09; 中断两种方式 …

STL--list和vector有什么区别

list 和 vector 是 C STL 中的两种常见容器&#xff0c;它们在底层实现、性能特性和适用场景方面有着显著的区别&#xff1a; 底层数据结构&#xff1a; vector 底层是一个动态数组&#xff0c;提供快速的随机访问&#xff0c;但在中间插入或删除元素效率较低。 list 是一个双…

鸿蒙ArkUI实例:【自定义组件】

组件是 OpenHarmony 页面最小显示单元&#xff0c;一个页面可由多个组件组合而成&#xff0c;也可只由一个组件组合而成&#xff0c;这些组件可以是ArkUI开发框架自带系统组件&#xff0c;比如 Text 、 Button 等&#xff0c;也可以是自定义组件&#xff0c;本节笔者简单介绍一…

ERC314协议代币开发及合约开发详解

ERC314 是一种新的代币标准&#xff0c;旨在为 BASE 链上的代币提供更便捷、高效的交易体验。它由 DAPJ 项目团队开发&#xff0c;并于 2023 年 8 月首次发布。 ERC314 的特点 无需依赖 DEX 或 SWAP 进行交易: ERC314 代币可以像原生代币一样直接转账&#xff0c;无需借助 DEX …

Lightroom Classic 2024成就专业摄影梦想mac/win版

Lightroom Classic 2024是一款功能强大的数字图像处理和管理工具&#xff0c;专为摄影师和摄影爱好者设计。它提供了丰富的照片调整、处理、管理和分享功能&#xff0c;帮助用户轻松管理、编辑和展示他们的照片。 Lightroom Classic 2024软件获取 首先&#xff0c;Lightroom C…