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://xiahunao.cn/news/3245748.html

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

相关文章

Python中的数据结构:五彩斑斓的糖果盒

在Python编程的世界里,数据结构就像是一个个五彩斑斓的糖果盒,每一种糖果都有其独特的味道和形状。这些多姿多彩,形状和味道各异的糖果盒子包括了:List(列表)、Tuple(元组)、Diction…

深度学习落地实战:识别火车票信息

前言 大家好,我是机长 本专栏将持续收集整理市场上深度学习的相关项目,旨在为准备从事深度学习工作或相关科研活动的伙伴,储备、提升更多的实际开发经验,每个项目实例都可作为实际开发项目写入简历,且都附带完整的代…

本地多模态看图说话-llava

其中图片为bast64转码,方便json序列化。 其中模型llava为本地ollama运行的模型,如:ollama run llava 还有其它的模型如:llava-phi3,通过phi3微调过的版本。 实际测试下来,发现本地多模型的性能不佳&…

【数智化案例展】某省会城市——轨道交通线网云平台建设

‍ 逸迅科技案例 本项目案例由逸迅科技投递并参与数据猿与上海大数据联盟联合推出的《2024中国数智化转型升级创新服务企业》榜单/奖项”评选。 大数据产业创新服务媒体 ——聚焦数据 改变商业 本项目将打造一个先进的线网指挥中心大数据平台,它将作为这座城市轨道…

钡铼Profinet、EtherCAT、Modbus、MQTT、Ethernet/IP、OPC UA分布式IO系统BL20X系列耦合器

BL20X系列耦合器是钡铼技术开发的一款用于分布式I/O系统的设备,专为工业环境下的高速数据传输和远程设备控制而设计,支持多种工业以太网协议,包括Profinet、EtherCAT、Modbus、MQTT、Ethernet/IP和OPC UA等。如果您正在考虑部署BL20X系列耦合…

如何制定高效的媒体公关解决方案

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 媒体公关解决方案是指企业或组织为提升品牌形象、塑造公众认知、应对危机事件等目的,通过媒体渠道制定并实施的一系列公关策略和行动计划。这一解决方案旨在通过有效的媒体沟…

4. JavaSE ——【移位运算符】

📖 开场白 亲爱的读者,大家好!我是一名正在学习编程的高校生。在这个博客里,我将和大家一起探讨编程技巧、分享实用工具,并交流学习心得。希望通过我的博客,你能学到有用的知识,提高自己的技能&…

智慧煤矿:AI视频智能监管解决方案引领行业新变革

随着科技的飞速发展,人工智能(AI)技术已经渗透到各个行业,为传统产业的转型升级提供了强大的动力。在煤矿行业中,安全监管一直是一个重要的议题。为了提高煤矿的安全生产水平,降低事故发生率,智…

6 款 SD 卡数据恢复软件,助您恢复丢失的文件

如果您经常使用摄像机、相机或某种类型的手机,您会发现您的数据和文件存储在 SD 卡上。这使得它成为设备中非常重要的一部分。但是,SD 卡相对容易损坏,这可能会导致您的文件和数据意外丢失。 此时,您需要采取一些措施来帮助您恢复…

springboot项目 导入 maven坐标 错误 Could not transfer artifact XXX

1.报错原因 当时导入的是 redis坐标 ,导入jar 包报错(当时是网速太慢了,一直卡着不动 就关了 idea 重新下载)结果报错 之前的redis 项目都可以的,网上找了一下 都没解决 2.解决办法 既然说不能传输, 就说…

Python数据爬取(续)

如有需要阅读可在资源下载,因文章设计内容,官方大大审核无法直接通过 已上传至GitCode上,如感兴趣可观看

机器学习 | 深入理解激活函数

什么是激活函数? 在人工神经网络中,节点的激活函数定义了该节点或神经元对于给定输入或一组输入的输出。然后,将此输出用作下一个节点的输入,依此类推,直到找到原始问题的所需解决方案。 它将结果值映射到所需的范围…

【后端开发实习】用MongoDB和Redis实现消息队列搭建分布式邮件消息系统

用Redis实现消息队列并搭建分布式邮件消息系统 系统介绍Redis实现消息队列思路分析代码实现 MongoDB监听数据变化思路分析代码实现Mongoose测试连接监听mongodb数据变化 注意点 系统介绍 本次要实现的是一个能够实现实时监控Mongodb中数据变化的系统,要能够在数据发…

VGMShield:揭秘视频生成模型滥用的检测与追踪技术

人工智能咨询培训老师叶梓 转载标明出处 视频生成模型,如 Stable Video Diffusion 和 Videocrafter,已经能够生成合理且高分辨率的视频。但这些技术进步也带来了被恶意利用的风险,比如用于制造假新闻或进行政治宣传。因此,来自弗…

彩电上自带的推箱子游戏是什么编程语言开发的?

2000年左右的厦新彩电上,自带了推箱子、华容道游戏。界面如下: 在线版推箱子游戏,网址:https://www.tuixiangzi.cn/ BASIC,全称是Beginners All-purpose Symbolic Instruction Code,含义是初学者通用符号…

【杰理蓝牙开发】AC695x 按键扫描接口分析

【杰理蓝牙开发】AC695x 按键ADC接口分析 0. 个人简介 && 授权须知1. 按键扫描配置和按键消息处理1.1 参数说明1.2 按键事件说明2. 应用层处理3. 特殊按键需求3.1 特殊需求 1:组合键3.2 特殊需求 2:按键多击事件3.3 特殊需求 3:某些按键只响应单击事件0. 个人简介 &…

AI算法20-分位数回归算法Quantile Regression | QR

分位数回归算法的概念 分位数回归算法简介 分位数回归(Quantile Regression)是一种统计方法,最早由Roger Koenker和Gilbert Bassett于1978年提出。它通过估计条件分位数函数来分析自变量与因变量之间的关系,与传统的最小二乘回归…

怎么压缩视频文件?简单的压缩视频方法分享

视频已成为我们日常生活中不可或缺的一部分。但随着视频质量的提高,文件大小也逐渐成为我们分享的阻碍。如何有效压缩视频文件,使其既能保持清晰,又能轻松分享?今天,给大家分享五种实用的视频压缩方法,快来…

昇思25天学习打卡营第02天|张量 Tensor

一、什么是张量 Tensor 张量是一种特殊的数据结构,与数组和矩阵非常相似。张量(Tensor)是MindSpore网络运算中的基本数据结构。 张量可以被看作是一个多维数组,但它比普通的数组更加灵活和强大,因为它支持在GPU等加速…

项目JetCache的常见配置与使用

Hello, 大家好,今天本汪给大家带来的是JetCache在项目中的常见配置与用法讲解,接下来,随本汪一起来看看吧 一、介绍 官网地址:https://github.com/alibaba/jetcache JetCache 是一种 Java 缓存抽象,它为不同的缓存…