Spring Web MVC入门(2)(请求2)

目录

1.传递JSON数据

传递JSON对象

2.获取URL中的参数@PathVariable

3.上传文件@RequestPart

4.获取Cookie/Session

(1)获取Cookie

简洁获取Cookie

(2)获取Session

Sesson读取

简洁获取Session(1)

简洁获取Session(2)

5.获取Header

简洁获取Header


1.传递JSON数据

JSON概念

JSON :JavaScript Object Notation(javaScript对象表示法)

JSON是一种轻量级的数据交互格式.它基于ECMAScript(欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储表示数据.

简单来说:JSON就是一种数据格式,有自己的格式和语法,使用文本表示一个对象或数组的信息,因此JSON本质是字符串,主要负责在不语言中数据传递和交换.

JSON语法

我们先来看一段JSON数据

{"squadName": "Super hero squad","homeTown": "Metro City","formed": 2016,"secretBase": "Super tower","active": true,"members": [{"name": "Molecule Man","age": 29,"secretIdentity": "Dan Jukes","powers": ["Radiation resistance", "Turning tiny", "Radiation 
blast"]}, {"name": "Madame Uppercut","age": 39,"secretIdentity": "Jane Wilson","powers": ["Million tonne punch", "Damage resistance", "Superhuman 
reflexes"]}, {"name": "Eternal Flame","age": 1000000,"secretIdentity": "Unknown","powers": ["Immortality", "Heat Immunity", "Inferno", 
"Teleportation", "Interdimensional travel"]}]}

JSON的语法:

1.数据在键值对(key/value)中

2.数据由逗号,分隔

3.对象用{}表示

5.值可以为对象,也可以为数组,数组中可以包含多个对象.

传递JSON对象

接受JSON对象,需要使用@RequestBody注解

?RequestBody:请求正文,意思是这个注解作用在请求正文的数据绑定,请求参数必须写在请求正文中

后端实现:

 @RequestMapping("/m1")public Object method1(@RequestBody Person person) {return person.toString();}

2.获取URL中的参数@PathVariable

Path Variable:路径变量

和字面表达的意思一样,这个注解主要作用在请求URL路径上的数据绑定

默认传递参数写在URL上,Spring MVC就可以获取到

后端代码实现: 

  @RequestMapping("/m2/{id}/{name}")public String method2(@PathVariable Integer id,@PathVariable("name") String userName) {return "解析参数id" + id + ",name: "+ userName;}

使用浏览器发送请求: 127.0.0.1:8080/test/m2/2/zhangsan

响应:

3.上传文件@RequestPart

后端代码实现:

 @RequestMapping("/m3")public String getfile(@RequestParam("file") MultipartFile file) throws IOException {String fileName = file.getOriginalFilename();file.transferTo(new File("D:\\javaAdvanced"+file.getOriginalFilename()));return "接收到文件名称为: " + fileName;}

使用postman发送请求:

4.获取Cookie/Session

HTTP 协议自身是属于"无状态"协议.

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

但实际开发中,我们很多时候是需要知道请求之间的关联关系的.

例如: 登陆网站成功后,第二次,第二次访问的时候服务器就能知道该请求是否是已经登陆过了.

上述图中的"令牌"通常就存储在Cookie字段中.

理解Session

我们先来了解一下什么是会话

会话:对话的意思

在计算机领域,会话是一个客户与服务器之间的不中断的请求响应.对客户的每个请求,服务器能够识别出请求来自于同一个客户.当一个未知的客户向Web应用程序发送一个请求时就开始了一个会话.当客户明确结束会话或服务器在一个时限内没有接收到客户的任何请求时,会话就结束了.

服务器同一时刻收到的请求是很多的.服务器需要清楚的区分每个请求时从属于哪个用户,也就是属于哪个会话,就需要在服务器这边记录每个会话以及与用户的信息的对应关系:

Session是服务器为了保存用户信息而创建的一个特殊对.

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

SessionID是由服务器生成的一个"唯一性字符串",从Session机制的角度来看,这个唯一性字符串称为"Session".但是站在整个登录流程中看待,也可以把这个唯一性字符串称为"token"

1.当用户登录的时候,服务器在Session中新增一个新记录,并把sessionID返回给客户端(通过HTTP响应中的Set-Cookie字段返回).

2.客户端后续再给服务器发送请求的时候,需要再请求中带上sessionID.(通过HTTP请求中的Cookie字段带上).

3.服务器收到请求之后,根据请求中的sessionID在Session信息中获取到对应的用户信息,再进行后续操作,找不到则重新创建Session,并把SessionID返回.

Session默认是保存在内存中的.如果重启服务器则Session数据就会丢失.

Cookie和Session的区别(面试题)

1.Cookie是客户端保存用户信息的一种机制.Session是服务器保存用户信息的一种机制.

2.Cookie和Session之间主要是通过SessionID关联起来的,SessionID是Cookie和Session之间的桥梁.

3.Cookie和Session经常会在一起配合使用.但是不是必须配合.

   1)完全可以用Cookie来baocun一些数据在客户端.这些数据不一定是用户身份信息,也不一定是SessionID

   2)Session中的sessionID也不需要非得通过Cookie/Set-Cookie传递,不如通过URL传递.

(1)获取Cookie

传统获取Cookie

    @RequestMapping("/m1")public String method1(HttpServletRequest request, HttpServletResponse response) {//获取所有cookie信息Cookie[] cookies = request.getCookies();//打印cookie信息StringBuilder builder = new StringBuilder();if(cookies != null) {for (Cookie ck : cookies) {builder.append(ck.getName()+":" + ck.getValue());}}return "Cookie信息: " + builder;}

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

HttpServletRequest , HttpServletResponse 是 Servlet提供的两个类,是Spring MVC方法的内置对象.需要时直接在方法中添加声明即可.

HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象提供方法,可以获得客户端请求的所有信息.

HttpServletResponse对象代表服务器的响应.HTTP响应的信息都在这个对象中,比如向客户端发送的数据,响应头,状态码等.通过这个对象提供的方法.可以获得服务器响应的所有内容

Spring MVC在这两个对象的基础上进行了封装,给我们提供了更加简单的使用方法.

此时没有设置cookie,通过浏览器访问:http://127.0.0.1:8080/test/m1,得到Cookie为null

我们设置一下Cookie的值

再次访问:

从这个例子中,可以看出Cookie是可以伪造的.也就是不安全的,所以使用Cookie时,后端需要进行校验.

简洁获取Cookie

  @RequestMapping("/getCookie")public String cookie(@CookieValue("xg") String xg) {return "xg" + xg;}

运行结果:  127.0.0.1:8080/test/getCookie

(2)获取Session

Session也是服务器端的机制,我们需要先存储,才能再获取

Session也是基于HttpServletRequest来存储和获取的

Session存储

@RequestMapping("/setSess")public String setsess(HttpServletRequest request) {//获取Session对象HttpSession session = request.getSession();if(session != null) {session.setAttribute("userName","java");}return "session存储成功";}

这个代码中看不到SessionID这样的概念的.getSession操作内部提取到请求中的Cookie里的SessionID,然后根据SessionID获取到对应的Session对象,Session对象用HttpSession来描述

获取Session有两种方式

HttpSession getSesson(boolean create)
HttpSession getSession();

HttpSession getSession(boolean create) : 参数如果为true,则当不存在会话时新建会话;参数如果为false,则当不存在会话时返回null.

HttpSession getSession() : 和 getSession(true) 含义一样,默认值为true.

void setAttribute(String name,Object value) : 使用指定的名称绑定一个对象到该session会话

Sesson读取

读取Session可以使用HttpServletRequest

   @RequestMapping("/getSess")public String sess(HttpServletRequest request ) {//如果session不存在,不会自动创建HttpSession session = request.getSession(false);String userName = null;if(session != null && session.getAttribute("userName") != null) {userName = (String) session.getAttribute("userName");}return "userName: " + userName;}

Object Attribute(String name) : 返回在该session会话中具有指定名称的对象,如果没有指定名称的对象,则返回null.

运行

先设置Session: http://127.0.0.1:8080/test/setSess

获取Session: http://127.0.0.1:8080/test/getSess

简洁获取Session(1)

    @RequestMapping("/getSess2")public String sess2(@SessionAttribute(value = "userName",required = false) String userName) {return "userName" + userName;}

运行: http://127.0.0.1:8080/test/getSess2

简洁获取Session(2)

通过Spring MVC内置对象HttpSession来获取

    @RequestMapping("/getSess3")public String sess3(HttpSession session) {String userName = (String) session.getAttribute("userName");return "userName: " + userName;}

运行: http://127.0.0.1:8080/test/getSess3

Session不存在的话,会自动进行创建

5.获取Header

传统获取Header

获取header也是从HttpServletRequest中获取

@RequestMapping("/getHeader")public String getHeader(HttpServletRequest request,HttpServletResponse response) {String uerAgent = request.getHeader("User-Agent");return "uerAgent" + uerAgent;}

使用getHeader方法来获取

运行: http://127.0.0.1:8080/test/getHeader

简洁获取Header

 @RequestMapping("/getHeader2")public String getHeader2(@RequestHeader("User-Agent") String userAgent) {return "userAgent: " + userAgent;}

运行: http://127.0.0.1:8080/test/getHeader2

@RequesetHeader注解的参数值为HTTP请求报头中的"Key"

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

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

相关文章

如何写好建模论文

如何写好建模论文 一、 写好数模答卷的重要性 1.评定参赛队的成绩好坏、高低,获奖级别, 数模答卷, 是唯一依据。 2.答卷是竞赛活动的成绩结晶的书面形式。 3.写好答卷的训练,是科技写作的一种基本训练。 二、 答卷的基本内容&…

从零开始学量化~Ptrade使用教程(六)——盘后定价交易、港股通与债券通用质押式回购

盘后固定价交易 实现科创板、创业板的盘后固定价交易,界面如下显示: 交易 输入科创板或创业板代码,选择委托方向,输入委托价格、委托数量,点击“买入”或“卖出”按钮进行委托。可出现一个委托提示框提示是否继续委托操…

QtC++ 设计模式(五)——状态模式

状态模式 序言理解源码 序言 设计模式只是一个抽象的设计模式方法,并不是一个固定使用的搭配,就算是普通switch语句,Map,乃至状态机都是状态模式的其中一种实现方法 状态模式看起来好像和策略模式差不多,主要是其的侧…

MySQL下载安装使用教程图文教程(超详细)

「作者简介」:冬奥会网络安全中国代表队,CSDN Top100,就职奇安信多年,以实战工作为基础著作 《网络安全自学教程》,适合基础薄弱的同学系统化的学习网络安全,用最短的时间掌握最核心的技术。 这一章节我们使…

【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【22】【RabbitMQ】

持续学习&持续更新中… 守破离 【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【22】【RabbitMQ】 Message Queue 消息队列异步处理应用解耦流量控制 消息中间件概念RabbitMQ概念MessagePublisherExchangeQueueBindingConnectionChannelConsumerVirtual HostBroker图…

内容长度不同的div如何自动对齐展示

平时我们经常会遇到页面内容div结构相同页,这时为了美观我们会希望div会对齐展示,但当div里的文字长度不一时又不想写固定高度,就会出现div长度长长短短,此时实现样式可以这样写: .e-commerce-Wrap {display: flex;fle…

WebSocket、服务器推送技术

WebSocket 是一种在单个 TCP 连接上进行 全双工 通信的协议,它可以让客户端和服务器之间进行实时的双向通信,且不存在同源策略限制 WebSocket 使用一个长连接,在客户端和服务器之间保持持久的连接,从而可以实时地发送和接收数据…

基于JAVA+SpringBoot+uniapp的心理小程序(小程序版本)

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、SpringCloud、Layui、Echarts图表、Nodejs、爬…

如何在web页面下做自动化测试?

自动化测试是在软件开发中非常重要的一环,它可以提高测试效率并减少错误率。在web页面下进行自动化测试,可以帮助我们验证网页的功能和交互,并确保它们在不同浏览器和平台上的一致性。本文将从零开始,详细介绍如何在web页面下进行…

网络安全防御【防火墙双机热备带宽管理综合实验】

目录 一、实验拓扑图 二、实验要求 三、实验思路: 四、实验步骤: 1、FW3的网络相关配置: 2、FW1的新增配置: 3、交换机LSW6(总公司)的新增配置: 4、双机热备技术配置(双机热…

【数据结构】链表(LinkedList)详解

文章目录 [toc] 前言1. 链表的介绍1.1 链表的定义1.2 链表的结构种类 2. 单向链表的模拟实现2.1 创建链表2.2 打印链表2.3 求链表长度 3. 单向链表常见方法的模拟实现3.1 头插法3.2 尾插法3.3 指定位置插入3.4 查找值 key 的节点是否在链表中3.5 删除值为 key 的节点3.6 删除所…

实验三:图像的平滑滤波

目录 一、实验目的 二、实验原理 1. 空域平滑滤波 2. 椒盐噪声的处理 三、实验内容 四、源程序和结果 (1) 主程序(matlab) (2) 函数GrayscaleFilter (3) 函数MeanKernel (4) 函数MedFilter 五、结果分析 1. 空域平滑滤波 2. 椒盐噪声的处理…

小阿轩yx-zookeeper+kafka群集

小阿轩yx-zookeeperkafka群集 消息队列(Message Queue) 是分布式系统中重要的组件 通用的使用场景可以简单地描述为 当不需要立即获得结果,但是并发量又需要进行控制的时候,差不多就是需要使用消息队列的时候。 消息队列 什么是消息队列 消息(Mes…

使用Docker 实现 MySQL 循环复制(二)

系列文章 使用Docker 实现 MySQL 循环复制(一) 目录 系列文章1. 创建三个 mysql 容器1.1 准备三个 mysql 容器的挂载卷1.2 为三个mysql实例创建配置文件1.3 修改各目录的权限以满足 mysql 容器的要求1.4 创建 docker-compose.yaml 文件1.5 创建容器 1. …

多源字段聚合重塑算法

要求如下 [[{"oone": "评估是否聘请第三方机构","otwo": null,"othree": "test",},{"oone": "评估是否聘请第三方机构","otwo": null,"othree": "test",}],[{"oon…

npm安装依赖包报错,npm ERR! code ENOTFOUND

一、报错现象: npm WARN registry Unexpected warning for https://registry.npmjs.org/: Miscellaneous Warning ETIMEDOUT: request to https://registry.npmjs.org/vue failed, reason: connect ETIMEDOUT 104.16.23.35:443 npm WARN registry Using stale data…

GitHub私有派生仓库(fork仓库) | 派生仓库改为私有

GitHub私有派生仓库 前言解决方案 前言 在GitHub上Fork的派生仓库默认为公有仓库,且无法修改为私有仓库。 若想创建私有的派生仓库,可通过GitHub的导入仓库功能实现,具体步骤请参见下文解决方案。 解决方案 打开GitHub页面,在个…

新书速览|深入理解Hive:从基础到高阶:视频教学版

《深入理解Hive:从基础到高阶:视频教学版》 本书内容 《深入理解Hive:从基础到高阶:视频教学版》采用“理论实战”的形式编写,通过大量的实例,结合作者多年一线开发实战经验,全面地介绍Hive的使用方法。《深入理解Hiv…

UE5.4新功能 - MotionDesign上手简介

MotionDesign是UE中集成的运动图形功能,我们在游戏中经常会见到,例如前方漂浮于空中的若干碎石,当玩家走进时碎石自动吸附合并变成一条路,或者一些装饰性的物件做随机运动等等,在引擎没有集成运动图形时,这…

【Hive SQL 每日一题】找出各个商品销售额的中位数

文章目录 测试数据需求说明需求实现方法1 —— 升序计算法方法2 —— 正反排序法 补充 测试数据 -- 创建 orders 表 DROP TABLE IF EXISTS orders; CREATE TABLE orders (order_id INT,product_id INT,order_date STRING,amount DOUBLE );-- 插入 orders 数据 INSERT INTO ord…