【JavaEE】_Spring MVC项目获取Cookie

目录

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.hqwc.cn/news/598043.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTTP的介绍

一.什么是HTTP? Hyper Text Transfer Protocol,超文本传输协议,规定了浏览器和服务器之间数据传输的规则。 二.HTTP的特点 (1)基于TCP协议:面向连接,安全 (2)基于请求-响应模型的&…

学习周报:文献阅读+Fluent案例+水力学理论学习

目录 摘要 Abstract 文献阅读:物理信息的神经网络与湍流传质的非封闭机制模型相结合 文献摘要 提出问题 提出方案 实验设置 所需方程介绍 雷诺时均方程(RANS) K-epsilon两方程模型 神经网络框架 DNN部分 损失函数定义 PINN部分…

JDK、JRE和JDK的关系

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏:每天一个知识点 ✨特色专栏&#xff1a…

鱼骨图功能实现

dom: <div class="module-content"><div class="title"><span>[</span><p>鱼骨图</p><span>]</span></div><div class="line-mian"></div><div :ref="module + i&q…

配置vscode用于STM32编译,Debug

配置环境参考&#xff1a; Docs 用cubemx配置工程文件&#xff0c;用VScode打开工程文件。 编译的时候会有如下报错&#xff1a; vscode出现process_begin :CreateProcess failed 系统找不到指定文件 解决方案&#xff1a;在你的makefile中加上SHELLcmd.exe就可以了 参考…

VRRP+MSTP+BFD

一、组网 二、要求 PC6&#xff08;vlan 10内PC&#xff09;访问1.1.1.1走JR-1——CORE1——MSR到1.1.1.1 PC7&#xff08;vlan 20内PC&#xff09;访问1.1.1.1走JR-2——CORE2——MSR到1.1.1.1 链路故障时切换路线&#xff0c;来回路径一致 三、配置步骤 SR bfd echo-sou…

大数据系列 | Kafka架构分析及应用

大数据系列 | Kafka架构分析及应用 1. Kafka原理分析2. Kafka架构分析3. Kafka的应用3.1. 安装Zookeeper集群3.2. 安装Kafka集群3.3. 生产者和消费者使用3.3.1. 生产者使用3.3.1. 消费者使用 4. Kafka Controller控制器 1. Kafka原理分析 Kafka是一个高吞吐量、 持久性的分布式…

C++进阶篇11---IO流

一、对C语言的输入输出的理解 C语言中我们经常用scanf()和printf()进行输入输出&#xff0c;形象的描述它们的作用如下 对于缓冲区的理解&#xff1a; 可以屏蔽掉低级I/O的实现&#xff0c;低级I/O的实现依赖操作系统本身内核的实现&#xff0c;所以如果能够屏蔽这部分的差异…

【使用flex两端对齐加margin-right】

解决办法众多&#xff1a;https://cloud.tencent.com/developer/article/1516801 <div class"job_tabs_content"><div class"job_tab_item"></div><div class"job_tab_item"></div><div class"job_tab_i…

C语言整数和小数的存储

1.整数在内存中的存储 计算机使用二进制进行存储、运算&#xff0c;整数在内存中存储使用的是二进制补码 1.1原码、反码、补码 整数的2进制表⽰⽅法有三种&#xff0c;即 原码、反码和补码 三种表⽰⽅法均有符号位和数值位两部分&#xff0c;符号位都是⽤0表⽰“正”&am…

vue快速入门(七)内联语句

注释很详细&#xff0c;直接上代码 上一篇 新增内容 button点击事件绑定内联语句写法与要求 源码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-wid…

C++搭建深度学习的推理框架

我们的目的是:借助C++搭建一个类似于pytorch,tensorflow的深度学习框架,对标pytorch,tensorflow实现对应的功能。由于本人能力有限,下面本人将借助C++搭建一个简单的全连接神经网络,并且尝试解释里面的算子定义和计算图构建。 算子定义 回顾pytorch里面搭建的全连接神经网…