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

news2024/11/23 15:11:27

目录

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.coloradmin.cn/o/1929465.html

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

相关文章

详解MySQL中的递归查询

MySQL中的递归查询主要通过WITH RECURSIVE语句来实现,这在处理具有层级关系或树形结构的数据时非常有用。下面将通过一个具体的例子来详细解释如何在MySQL中使用递归查询。 示例场景 假设我们有一个部门表(departments),其中包含…

【docker 部署springboot项目】

一、docker安装 1.检查Linux内核版本高于3.10才可安装 uname -r 2. 卸载旧版本 sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine 3. 使用docker仓库进行安装 安装所需的软…

C1W3.Assignment: Hello Vectors

理论课:C1W3.Vector Space Models 文章目录 Importing the data生成word_embeddings_subset(optional)Predict relationships among wordsCosine SimilarityEuclidean distance Finding the country of each capitalModel AccuracyPlotting …

性能测试学习-woniusales

1、性能测试分类:服务器,客户端 服务器端: 代码级多线程协议级多线程 客户端:JavaScript, Android ,PC客户端 性能测试容易出现瓶颈的点:带宽,代码优化(例,等差,等比…

hbase命令行操作

1.进入命令行 hbase shell 2.基础命令 查看帮助信息help --查看版本信息--version --查看hbase集群状态--status --查看当前用户--whoami 3.命名空间命令 -查看所有命名空间--list_namespace --查询指定命名空间的表 --list_namespace_tables 命名空间名 --创建命名空间 --cre…

字节抖音电商 后端开发岗位 一面

笔者整理答案,以供参考 自我介绍 项目(20分钟) RocketMQ延时消息的底层实现 回答: 延时消息的实现主要依赖于RocketMQ中的定时任务机制。消息被发送到Broker时,会先存储在一个特定的延时消息队列中。Broker会定时扫…

怎么选流量套餐最划算呢,这篇文章建议收藏!

据小编了解,现在大多数用户手上都不止一张SIM卡,大部分都是双卡,甚至三卡了,那么,这些卡槽你真的利用对了吗? 这篇文章就告诉大家,如何更好的利用这两个卡槽,让你即省钱&#xff0c…

Day11: 110.平衡二叉树 257. 二叉树的所有路径 404.左叶子之和 222.完全二叉树的节点个数

题目110. 平衡二叉树 - 力扣(LeetCode) /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) …

元服务体验-服务管理与分享

服务管理 通过桌面、负一屏、应用市场、元服务等场景对元服务进行添加、收藏、移除等管理操作。 服务分享 元服务与服务卡片支持近场与远场分享,可流转给设备也可以分享给联系人。 收到他人分享的元服务,可无需安装直接打开使用,或添加至负…

PEST分析法

PEST分析法是一种用于企业战略规划的工具,它通过对企业所处的宏观环境进行分析,帮助企业识别出影响其战略决策的关键因素。PEST分别代表政治(Political)、经济(Economic)、社会(Sociocultural&a…

架构设计-NX的二次开发API架构设计介绍

1.与整体的关系 2.API设计目标 能够允许用户访问NX的所有UI工具组件,二次开发用户能够编写外观和运行行为类似NX的应用程序。能够允许用户直接访问NX数据模型即使底层数据结构和功能实现发生很大变化,API接口保持稳定,不会影响上层用户。 3…

数码暴龙机(电波暴龙机)彩色复刻版!!| 使用Python、PySide6、pixilart自制windows桌面宠物

一、前言 数码暴龙机(电波暴龙机)是万代公司发售的一系列与《数码兽》系列相关的液晶玩具商品。这些产品融合了养成和对战元素,为玩家提供了一种虚拟养成和战斗的娱乐体验。也是很多人的童年回忆。最近在B站刷到讲解暴龙通关的教程和视频&…

java——Junit单元测试

测试分类 黑盒测试:不输入代码,给输入值,看程序能够给出期望的值。 白盒测试:写代码,关注程序具体执行流程。 JUnit单元测试 一个测试框架,供java开发人员编写单元测试。 是程序员测试,即白…

qt 创建一个可以拖拽的矩形,简单实践

1.概要 需求&#xff0c;一个可以拖拽的矩形&#xff0c;鼠标接近边线点击变成可拖拽形状。 2.代码 #include <QApplication> #include <QGraphicsView> #include <QGraphicsScene> #include <QGraphicsRectItem> #include <QMouseEvent> #in…

教大家如何下载保存腾讯会议的视频到本地

引言&#xff1a; 大家好&#xff0c;今天教大家如何下载保存腾讯会议的视频到本地&#xff0c;我们这边是地方网络技术&#xff01; 很多时候&#xff0c;腾讯会议的视频是无法直接下载保存的。今天我们就教大家如何下载保存腾讯会议的视频到本地。方法非常简单一&#xff0…

基于Faster R-CNN的安全帽目标检测

基于Faster R-CNN的安全帽目标检测项目通常旨在解决工作场所&#xff0c;特别是建筑工地的安全监管问题。这类项目使用计算机视觉技术&#xff0c;特别是深度学习中的Faster R-CNN算法&#xff0c;来自动检测工人是否正确佩戴了安全帽&#xff0c;从而确保遵守安全规定并减少事…

iOS ------ 消息传递和消息转发

一&#xff0c;消息传递 在OC中&#xff0c;传递消息就是在对象上调用方法。 相对于C语言的方法就“静态绑定”的函数&#xff0c;在编译器就决定了运行时所要调用的函数。在OC中&#xff0c;如果向某对象传递消息&#xff0c;就会使用动态绑定机制来决定需要调用那个方法。调…

网易天音:网易云音乐推出的一站式AI音乐创作工具

网易天音是一款由网易云音乐推出的AI音乐创作工具&#xff0c;它为音乐爱好者和专业歌手提供了一个便捷高效的创作平台。用户可以通过输入灵感&#xff0c;利用AI技术辅助完成作词、作曲、编曲和演唱&#xff0c;生成初稿后还可以进行词曲协同调整&#xff0c;以满足个性化的音…

ScanImage介绍

ScanImage 是由 Howard Hughes Medical Institute (HHMI) 的 Janelia Research Campus 开发的一款开源显微镜控制软件&#xff0c;专门用于双光子显微镜和其他高端显微镜系统的控制和数据采集。它被广泛应用于神经科学和生物医学研究领域&#xff0c;以其高效的成像性能和灵活的…

CSA笔记2-文件管理命令

tree 以树状图显示多级目录 示例&#xff1a; [rootlocalhost ~]# tree haha/ haha/ └── 111 └── 222 2 directories, 0 files [rootlocalhost ~]# tree -L 1 haha/haha/ └── 111 echo > >> < << 示例&#xff1a; [rootxxx ~]#…