当前位置: 首页 > news >正文

【Spring MVC】如何获取cookie/session以及响应@RestController的理解,Header的设置

前言

🌟🌟本期讲解关于SpringMVC的编程之参数传递~~~

🌈感兴趣的小伙伴看一看小编主页:GGBondlctrl-CSDN博客

🔥 你的点赞就是小编不断更新的最大动力                                       

🎆那么废话不多说直接开整吧~~

目录

📚️1.请求

1.1了解Cookie与Session

1.2获取Cookie

1.传统的方式

2.注解的方式

1.3获取Session

1.传统的方式

2.注解的方式

1.4获取Header

1.传统的方式

2.注解的方式

📚️2.响应

2.1返回静态页面

2.2@RestController与@Controller的区别

2.3设置状态码

2.4设置Header

📚️3.总结


 

📚️1.请求

1.1了解Cookie与Session

回顾之前我们学习过的cookie,我们知道这是用于浏览器与页面存储某些信息的部分,而HTTP 协议⾃⾝是属于 "⽆状态" 协议

无状态:默认情况下 HTTP 协议的客⼾端和服务器之间的这次通信, 和下次通信之间没有直接的联系.

但是在实际开发中,在第一次用户登录后是要存储用户的信息的,第⼆次访问的时候服务器就能知道该请求是否是已经登陆过了.具体的情况就是如下所示:

解释:

上面的令牌就是存储在cookie中的,下次访问服务器的时候,就要带上cookie中的“令牌”,此时在服务器这边就需要记录"令牌"信息, 以及令牌对应的⽤⼾信息, 这个就是 Session 机制所做的⼯作. 

理解session
我们先来了解⼀下什么是会话.会话: 对话的意思

解释:

会话是⼀个客⼾与服务器之间的不中断的请求响应. 对客⼾的每个请求,服务器能够识别出请求来⾃于同⼀个客⼾.

当⼀个未知的客⼾向Web应⽤程序发送第⼀个请求时就开始了⼀个会话.当客⼾明确结束会话或服务器在⼀个时限内没有接受到客⼾的任何请求时,会话就结束了

总结:

服务器需要清楚的区分每个请求是属于哪个⽤⼾, 也就是属于哪个会话, 就需要在服务器这边记录每个会话以及与⽤⼾的信息的对应关系.

所以session就是服务器用来保存用户信息而创建的一个特殊的对象;

Session的本质就是⼀个 "哈希表", 存储了⼀些键值对结构. Key 就是SessionID, Value 就是⽤⼾信息(⽤⼾信息可以根据需求灵活设计

此时cookie和session就可以合作来完成这个过程:

解释:

1,首先客户端发送请求后,服务器就会返回创建一个session,然后把sessionID通过setcookie放回给客户端,存在客户端中cookie里。

2.当客户端第二次进行访问的时候,就会带上cookie,发送请求

3.此时服务器就会拿到里面的sessionID这个key,然后查找session这个对象,返回给客户端

这两者的区别:

• Cookie 是客⼾端保存⽤⼾信息的⼀种机制. Session 是服务器端保存⽤⼾信息的⼀种机制.
• Cookie 和 Session之间主要是通过 SessionId 关联起来的, SessionId 是 Cookie 和 Session 之间的桥梁
• Cookie 和 Session 经常会在⼀起配合使⽤. 但是不是必须配合.

1.2获取Cookie

1.传统的方式

代码如下所示:

 public String request10(HttpServletRequest request){Cookie[] cookies = request.getCookies();if(cookies!=null){Arrays.stream(cookies).forEach(cookie -> {System.out.println(cookie.getName()+":"+cookie.getValue());});}return "获取到cookie";}

解释:

Spring MVC是基于 Servlet API 构建的原始 Web 框架, 也是在Servlet的基础上实现的;

HttpServletRequest 对象代表客⼾端的请求, 当客⼾端通过HTTP协议访问服务器时,HTTP请
求头中的所有信息都封装在这个对象中

HttpServletResponse 对象代表服务器的响应. HTTP响应的信息都在这个对象中, ⽐如向客⼾
端发送的数据, 响应头, 状态码等

这里获取到cookie后,转化为数据流的方式,进行增强循环实现打印; 

当我们进行测试后:

此时就能够在下面的面板中得到这里的字符串,但是有由于没有设置,所以我们能够自己进行设置cookie的值,此时我们可以在浏览器中进行修改:

此时我们再次启动刷新·:

我们就可以在控制面板进行观察了~~

2.注解的方式

这里spring进行分装,此时就可以使用注解代替,但是这种方式只能获取指定的cookie,具体的代码就是如下所示:

  @RequestMapping("r11")public String request11(@CookieValue("nihao") String nihao){return "nihao的cookie值:"+nihao;}

此时我们就可以拿到cookie中“nihao”的value值:

那么就可以拿到返回的cookie值了;

1.3获取Session

我们知道session是服务器的,此时我们就不能在客户端浏览器进行修改,所以此时我们就在代码中先设置session的值,这里和上面的cookie大差不差;

@RequestMapping("r13")public String request13(HttpServletRequest request){HttpSession session=request.getSession();session.setAttribute("name","zhangsan");return "session设置成功";}

此时我们就可以通过httpservletrequest来进行设置;还有这里的session是一个键值对的形式,所以要有两个参数;

那么接下来我们就可以获取session了:

1.传统的方式
 @RequestMapping("r12")public String request(HttpServletRequest request){HttpSession session= request.getSession();String name=(String) session.getAttribute("name");return "获取到了session:"+name;}

这里也是通过HttpServletRequest 来进行操作,输入对应的key的值“value”来进行操作,我们进行postman进行测试获取:

那么就可以看到拿到了session的值,

2.注解的方式

此时和上面一致,进行了封装,那么此时我们就可以拿到session的值了,并且代码更加的简单

 @RequestMapping("r16")public String request16(@SessionAttribute("name") String name){return "获取到了session"+name;}

这里还是只能获取对应的key值的value,通过参数来接收这里的session的值;这里小编就不在进行演示了

注意:若没有获取到session的值,并且为null,很有可能就是刷新了浏览器,由于session是存储来内存中的,所以此时我们就要重新再次建立session,然后再获取session;

1.4获取Header

这里还是一样的,我们知道HttpServletRequest包含了所有请求头中的所有相关的信息,此时也可以通过这个来进行某个属性的获取;

1.传统的方式

代码如下:

 @RequestMapping("r17")public String request17(HttpServletRequest httpServletRequest){String contentType=httpServletRequest.getHeader("Content-Type");return contentType;}

注意:此时我们直接进行操作,是不会得到任何的数据,这里代表就是数据传输的方式,此时我们需要在postman中进行数据的编写:

此时我们再次点击发送,那么此时的数据传输就是JSON的格式了:

2.注解的方式

代码如下所示:

@RequestMapping("r18")public String request18(@RequestHeader("Content-Type") String contentType){return contentType;}

这里和上面几乎是一致的,还是一样的返回指定content-type,那么所以小编就不再进行演示和赘述了;

📚️2.响应

2.1返回静态页面

首先我们需要进行html的设置,代码如下:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Index⻚⾯</title>
</head>
<body>Hello,Spring MVC,我是Index⻚⾯.
</body>
</html>

此时我们规定的后端代码就是如下所示:

@RestController
@RequestMapping("response")
public class ResponseController {@RequestMapping("jump")public String response1(){return "/index.html";}

此时我们进行输出后,返回就是如下所示的:

此时我们想要返回的是一个html页面,结果这里当成了数据进行返回了,那么此时我们就可以通过更改注解名的方式进行操作

@Controller
@RequestMapping("response")
public class ResponseController {@RequestMapping("jump")public String response1(){return "/index.html";}

解释:

此时就是将上面的restcontroller进行了更改为controller,那么此时就可以进行html的页面的跳转了,那么这是问什么呢,下面小编将进行讲解

2.2@RestController与@Controller的区别

随着互联⽹的发展, ⽬前项⽬开发流⾏"前后端分离"模式, Java主要是⽤来做后端项⽬的开发, 所以也就不再处理前端相关的内容了
MVC的概念也逐渐发⽣了变化, View不再返回视图, ⽽是返回显⽰视图时需要的数据.

所以:@RestController 其实是返回的数据

@java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE})
@java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME)
@java.lang.annotation.Documented
@org.springframework.stereotype.Controller
@org.springframework.web.bind.annotation.ResponseBody
public @interface RestController {@org.springframework.core.annotation.AliasFor(annotation = org.springframework.stereotype.Controller.class)java.lang.String value() default "";
}

 解释:

上面的代码最重要的就是代表了如下:

@RestController = @Controller + @ResponseBody 

所以:如果想返回视图的话, 只需要把 @ResponseBody 去掉就可以了, 也就是 @Controller ,这里的@ResponseBody 代表就是返回数据据

注意: 

@ResponseBody:这既可以用作类,也可以用在方法上面,代表就是返回的是数据,如果上面的@RestController被@Controller代替后,想要返回数据,不是视图,那么就可以使用@ResponseBody加在方法上面;

@Controller不能用在方法上面,如下图所示:

2.3设置状态码

 Spring MVC会根据我们⽅法的返回结果⾃动设置响应状态码, 程序员也可以⼿动指定状态码
通过Spring MVC的内置对象HttpServletResponse 提供的⽅法来进⾏设置

代码如下:

 @RequestMapping("setstatus")@ResponseBodypublic String setstatus(HttpServletResponse httpServletResponse){httpServletResponse.setStatus(401);return "状态码设置成功";}

此时我们使用postman进行发送请求,用fiddler进行抓包:

可以发现,状态码本来因该是200,但是被修改后成为了401;所以状态码不一定会影响是否响应成功;

2.4设置Header

这里小编就直接步入正题吧:

我们首先看看这个@RequestMapping的内部的原码;

 java.lang.String name() default "";@org.springframework.core.annotation.AliasFor("path")java.lang.String[] value() default {};@org.springframework.core.annotation.AliasFor("value")java.lang.String[] path() default {};org.springframework.web.bind.annotation.RequestMethod[] method() default {};java.lang.String[] params() default {};java.lang.String[] headers() default {};java.lang.String[] consumes() default {};java.lang.String[] produces() default {};

解释:

1.value: 指定映射的URL
2. method: 指定请求的method类型, 如GET, POST等
3. consumes: 指定处理请求(request)的提交内容类型(Content-Type),例如application/json,
text/html;
4. produces: 指定返回的内容类型,还可以同时设置返回值的字符编码
5. Params: 指定request中必须包含某些参数值时,才让该⽅法处理
6. headers: 指定request中必须包含某些指定的header值,才能让该⽅法处理请求

其实在上面有几个是小编之前讲解到的,这里就举几个其他的例子:

produce:规定返回的内容的类型:

@RequestMapping(value = "/returnJson2",produces = "application/json")@ResponseBodypublic String returnJson2() {return "ji";}

 此时我们进行抓包处理:

可以看到此时就是JSON的格式;

method指定请求的方法:

@RequestMapping(value = "/method",method = RequestMethod.POST)public String method(){return "方法观察";}

此时我们使用postman进行发送请求

此时若为get方法,那么就会出现方法不被允许的错误,所以在我们更改请求的方法后:

我们进行抓包,可以看到此时的结果就是如下所示:

那么此时就是:抓包的结果,可以看到请求的方法就是post;

📚️3.总结

本期小编主要讲解了关于cookie和session的概念和如何进行获取的操作,这里包括了传统的代码编写方式,以及注解的代码编写的方式;还讲解了响应中比较重要的@RestController的概念理解,和状态码,Header的设置;

🌅🌅🌅~~~~最后希望与诸君共勉,共同进步!!!


💪💪💪以上就是本期内容了, 感兴趣的话,就关注小编吧。

                 😊😊  期待你的关注~~~

相关文章:

【Spring MVC】如何获取cookie/session以及响应@RestController的理解,Header的设置

前言 &#x1f31f;&#x1f31f;本期讲解关于SpringMVC的编程之参数传递~~~ &#x1f308;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondlctrl-CSDN博客 &#x1f525; 你的点赞就是小编不断更新的最大动力 &#x1f386;那么废…...

C++设计模式行为模式———策略模式

文章目录 一、引言二、策略模式三、总结 一、引言 策略模式是一种行为设计模式&#xff0c; 它能让你定义一系列算法&#xff0c; 并将每种算法分别放入独立的类中&#xff0c; 以使算法的对象能够相互替换。与模板方法模式类似&#xff0c;都是以扩展的方式来支持未来的变化。…...

Spring Cloud 中 bootstrap.yml 配置文件详解

Spring Cloud 中 bootstrap.yml 配置文件详解 1. 什么是 bootstrap.yml&#xff1f; bootstrap.yml 是 Spring Cloud 提供的一个特殊配置文件&#xff0c;主要用于初始化 Spring Cloud 应用程序的环境。与常见的 application.yml 不同&#xff0c;bootstrap.yml 在 Spring 应用…...

Java项目实战II基于SpringBoot前后端分离的网吧管理系统(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、核心代码 五、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着互联网技术的不断发展…...

ASP网络安全讲述

一 前言   Microsoft Active Server Pages&#xff08;ASP&#xff09;是服务器端脚本编写环境&#xff0c;使用它可以创建和运行动态、交互的 Web 服务器应用程序。使用 ASP 可以组合 HTML 页 、脚本命令和 ActiveX 组件以创建交互的 Web 页和基于 Web 的功能强大的应用程序…...

DFS 创建分级菜单

菜单级别不确定&#xff0c;想要自适应&#xff0c;且可以折叠的菜单。 数据是一个数组。 <template><div class"Level" ref"Level"></div> </template>import {ref} from vue export default{data(){Level:ref(null),menuData…...

HDU Go Running(最小点覆盖 + 网络流优化)

题目大意&#xff1a;有一条无限长跑道&#xff0c;每个人可以规定自己跑步的方向&#xff0c;起点&#xff0c;跑步起止时间。每个人跑步的速度都是1m/s。最后从监控人员哪里得到了n个报告&#xff0c;每个报告给出了某人在某一时候所在的位置&#xff0c;问跑步的最少可能人数…...

C++设计模式-中介者模式

动机(Motivation) 多个对象相互关联的情况&#xff0c;对象之间常常会维持一种复杂的引用关系&#xff0c;如果遇到一些需求的更改&#xff0c;这种直接的引用关系将面临不断的变化。在这种情况下&#xff0c;可以使用一种”中介对象“来管理对象间的关联关系&#xff0c;避免…...

文件上传与下载服务 | Flask 实战

之前介绍了 droppy 文件共享服务的搭建。但在一些场景中&#xff0c;我们需要在命令行或在 Python 代码中&#xff0c;临时上传和下载文件。这时可以用一个更简单的策略&#xff1a;使用 flask 编写一个临时的 API。 服务端配置 以下是一个简单的 Flask 应用程序代码示例&…...

MySQL 中的排序:索引排序与文件排序

文章目录 MySQL 中的排序&#xff1a;索引排序与文件排序全解析一、引言二、索引排序&#xff08;一&#xff09;原理&#xff08;二&#xff09;示例 三、文件排序&#xff08;一&#xff09;单路排序&#xff08;二&#xff09;双路排序&#xff08;三&#xff09;归并排序 四…...

深入理解React Hooks:使用useState和useEffect

引言 React Hooks是React 16.8引入的一项强大功能&#xff0c;它使函数组件能够使用状态和其他React特性。本文将深入探讨两个最常用的Hooks&#xff1a;useState和useEffect&#xff0c;并通过实际代码示例展示它们的使用方法。 1. 什么是React Hooks&#xff1f; React Ho…...

AWS codebuild + jenkins + github 实践CI/CD

前文 本文使用 Jenkins 结合 CodeBuild, CodeDeploy 实现 Serverless 的 CI/CD 工作流&#xff0c;用于自动化发布已经部署 lambda 函数。 在 AWS 海外区&#xff0c;CI/CD 工作流可以用 codepipeline 这项产品来方便的实现&#xff0c; CICD 基本概念 持续集成( Continuous…...

Android PMS(Package Manager Service)源码介绍

文章目录 前言一、PMS 启动流程二、APK 安装流程三、APK 卸载流程四、权限管理静态权限动态权限 五、 数据存储与一致性六、 PMS 的安全性策略1、权限检查2、签名认证3、动态权限管理4、应用安装验证5、保护系统目录 七、PMS 调试方法总结 前言 PackageManagerService&#xf…...

运维面试整理总结

面试题可以参考:面试题总结 查看系统相关信息 查看系统登陆成功与失败记录 成功&#xff1a;last失败&#xff1a;lastb 查看二进制文件 hexdump查看进程端口或连接 netstat -nltp ss -nltp补充&#xff1a;pidof与lsof命令 pidof [进程名] #根据 进程名 查询进程id ls…...

图数据库 Cypher语言

图数据库 属性图 属性图&#xff08;Property Graph&#xff09;概述 属性图是一种广泛用于建模关系数据的图数据结构&#xff0c;它将**顶点&#xff08;节点&#xff09;和边&#xff08;关系&#xff09;**进行结构化存储&#xff0c;并为它们附加属性以提供丰富的语义信…...

阿里云oss转发上线-实现不出网钓鱼

本地实现阿里云oss转发上线&#xff0c;全部代码在文末&#xff0c;代码存在冗余 实战环境 被钓鱼机器不出网只可访问内部网络包含集团oss 实战思路 若将我们的shellcode文件上传到集团oss上仍无法上线&#xff0c;那么就利用oss做中转使用本地转发进行上线&#xff0c;先发送…...

Spring Boot 3.4.0 发行:革新与突破的里程碑

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…...

【网络安全】

黑客入侵 什么是黑客入侵&#xff1f; “黑客”是一个外来词&#xff0c;是英语单词hacker的中文音译。最初&#xff0c;“黑客”只是一个褒义词&#xff0c;指的是那些尽力挖掘计算机程序最大潜力的点脑精英&#xff0c;他们讨论软件黑客的技巧和态度&#xff0c;以及共享文化…...

在SQLyog中导入和导出数据库

导入 假如我要导入一个xxx.sql&#xff0c;我就先创建一个叫做xxx的数据库。 然后右键点击导入、执行SQL脚本 选择要导入的数据库文件的位置&#xff0c;点击执行即可 注意&#xff1a; 导入之后记得刷新一下导出 选择你要导出的数据库 右键选择&#xff1a;备份/导出、…...

RabbitMQ简单应用

概念 RabbitMQ 是一种流行的开源消息代理&#xff08;Message Broker&#xff09;软件&#xff0c;它实现了高级消息队列协议&#xff08;AMQP - Advanced Message Queuing Protocol&#xff09;。RabbitMQ 通过高效的消息传递机制&#xff0c;主要应用于分布式系统中解耦应用…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版​分享

平时用 iPhone 的时候&#xff0c;难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵&#xff0c;或者买了二手 iPhone 却被原来的 iCloud 账号锁住&#xff0c;这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

OkHttp 中实现断点续传 demo

在 OkHttp 中实现断点续传主要通过以下步骤完成&#xff0c;核心是利用 HTTP 协议的 Range 请求头指定下载范围&#xff1a; 实现原理 Range 请求头&#xff1a;向服务器请求文件的特定字节范围&#xff08;如 Range: bytes1024-&#xff09; 本地文件记录&#xff1a;保存已…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

爬虫基础学习day2

# 爬虫设计领域 工商&#xff1a;企查查、天眼查短视频&#xff1a;抖音、快手、西瓜 ---> 飞瓜电商&#xff1a;京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空&#xff1a;抓取所有航空公司价格 ---> 去哪儿自媒体&#xff1a;采集自媒体数据进…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

在Ubuntu24上采用Wine打开SourceInsight

1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖

在Vuzix M400 AR智能眼镜的助力下&#xff0c;卢森堡罗伯特舒曼医院&#xff08;the Robert Schuman Hospitals, HRS&#xff09;凭借在无菌制剂生产流程中引入增强现实技术&#xff08;AR&#xff09;创新项目&#xff0c;荣获了2024年6月7日由卢森堡医院药剂师协会&#xff0…...

springboot整合VUE之在线教育管理系统简介

可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生&#xff0c;小白用户&#xff0c;想学习知识的 有点基础&#xff0c;想要通过项…...

JavaScript基础-API 和 Web API

在学习JavaScript的过程中&#xff0c;理解API&#xff08;应用程序接口&#xff09;和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能&#xff0c;使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...