Spring Web开发(请求)获取JOSN对象| 获取数据(Header)

news2024/12/26 6:38:44

大家好,我叫小帅今天我们来继续Spring Boot的内容。

文章目录

  • 1. 获取JSON对象
  • 2. 获取URL中参数@PathVariable
  • 3.上传⽂件@RequestPart
  • 3. 获取Cookie/Session
    • 3.1 获取和设置Cookie
      • 3.1.1传统获取Cookie
      • 3.1.2简洁获取Cookie
    • 3. 2 获取和存储Session
      • 3.2.1获取Session(1)使⽤ HttpServletRequest
      • 3.2.2简洁获取 Session(1) @SessionAttribute(value = "username",required = false)
      • 3.2.2简洁获取 Session(2)
  • 4. 获取Header
    • 4.1传统获取 header
    • 4.2简洁获取 Header (@RequestHeader("User-Agent") 里面参数是header里面的键值对的Key)


1. 获取JSON对象

接收JSON对象, 需要使⽤ @RequestBody 注解,作用是这个 方法或者类是返回正文

但是@RestController = @RequestBody + @Controller所以我们使用@RestController就可以。

代码:

@RestController
@RequestMapping("/test")
public class test {
    //produces参数是返回JSON字符串
    @RequestMapping(value = "/getUser", produces = "application/json")
    public String getUser() {
        User user = new User("111111", "111111");
        return user.toString();//字符串的方式返回
    }

    //consumes参数是传过来JSON字符串(可以是格式化的JOSN字符串)
    @RequestMapping(value = "/setUser",
            produces = "application/json", consumes = "application/json")
    public String setUser(String name, String password) {
        User user = new User(name, password);
        return user.toString();
    }
}

后端正确接收了
通过Fiddler观察⼀下请求参数效果:
get:
在这里插入图片描述

post:
在这里插入图片描述


2. 获取URL中参数@PathVariable

path variable: 路径变量

和字⾯表达的意思⼀样, 这个注解主要作⽤在请求URL路径上的数据绑定
默认传递参数写在URL上,SpringMVC就可以获取到.

后端实现代码:

@RequestMapping("/get/{name}/{password}")
    public String method8(@PathVariable String name,
                          @PathVariable("name") String password){
        return "解析路径:name:" + name + ",password:" + password;
    }

是postman发送请求:
在这里插入图片描述


3.上传⽂件@RequestPart

后端代码实现:

    @RequestMapping("getFile")
    public String pushFile(@RequestPart("file") MultipartFile file) throws IOException {
        //获取文件名称
        String fileName = file.getOriginalFilename();
        return fileName;
    }

效果:

在这里插入图片描述
上传成功了。


3. 获取Cookie/Session

理解cookie

HTTP 协议⾃⾝是属于 “⽆状态” 协议.
“⽆状态” 的含义指的是:
默认情况下 HTTP 协议的客⼾端和服务器之间的这次通信, 和下次通信之间没有直接的联系.

但是实际开发中, 我们很多时候是需要知道请求之间的关联关系的.
例如登陆⽹站成功后, 第⼆次访问的时候服务器就能知道该请求是否是已经登陆过了.

在这里插入图片描述
上述图中的 “令牌” 通常就存储在 Cookie 字段中。
比如说,我现在访问了csdn,现在我又退了出去,这个时候浏览器就自动保存了一个身份标识。
在这里插入图片描述
理解Session

我们先来了解⼀下什么是会话,就是对话的意思。
在这里插入图片描述
会话是⼀个客⼾与服务器之间的不中断的请求响应. 对客⼾的每个请求,服务器能够识别出请求来⾃于同⼀个客⼾. 当⼀个未知的客⼾向Web应⽤程序发送第⼀个请求时就开始了⼀个会话.当客⼾明确结束会话或服务器在⼀个时限内没有接受到客⼾的任何请求时,会话就结束了.

Session是服务器为了保存⽤⼾信息⽽创建的⼀个特殊的对象.

服务器需要清楚的区分每个请求是属于哪个⽤⼾, 也就是属于哪个会话, 就需要在服务器这边记录每个会话以及与⽤⼾的信息的对应关系.
在这里插入图片描述
Session的本质就是⼀个 “哈希表”, 存储了⼀些键值对结构. Key 就是SessionID, Value 就是⽤⼾信息(⽤⼾信息可以根据需求灵活设计).

在这里插入图片描述

  1. 当⽤⼾登陆的时候, 服务器在 Session 中新增⼀个新记录, 并把 sessionId返回给客⼾端. (通过HTTP 响应中的 Set-Cookie 字段返回).
  2. 客⼾端后续再给服务器发送请求的时候, 需要在请求中带上 sessionId. (通过 HTTP 请求中的Cookie 字段带上).
  3. 服务器收到请求之后, 根据请求中的 sessionId在 Session 信息中获取到对应的⽤⼾信息, 再进⾏后续操作.找不到则重新创建Session, 并把SessionID返回。

在这里插入图片描述

Cookie 和 Session 的区别

  1. Cookie 是客⼾端保存⽤⼾信息的⼀种机制. Session 是服务器端保存⽤⼾信息的⼀种机制.
  2. Cookie 和 Session之间主要是通过 SessionId 关联起来的, SessionId 是 Cookie 和 Session 之间的桥梁。
  3. cookie 和 Session 经常会在⼀起配合使⽤. 但是不是必须配合。
  1. 完全可以⽤ Cookie 来保存⼀些数据在客⼾端. 这些数据不⼀定是⽤⼾⾝份信息, 也不⼀定是SessionId。
  2. Session 中的sessionId 也不需要⾮得通过 Cookie/Set-Cookie 传递, ⽐如通过URL传递.

3.1 获取和设置Cookie

3.1.1传统获取Cookie

代码:

    @RequestMapping("/getCookie")
    public String method10(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响应的信息都在这个对象中, ⽐如向客⼾
端发送的数据, 响应头, 状态码等. 通过这个对象提供的⽅法, 可以获得服务器响应的所有内容

看看效果:

在这里插入图片描述

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

我们设置⼀下Cookie的值,键盘f12
在这里插入图片描述
再次访问:
在这里插入图片描述
从这个例⼦中, 也可以看出Cookie是可以伪造的, 也就是不安全的, 所以使⽤Cookie时, 后端需要进⾏Cookie校验


3.1.2简洁获取Cookie

    @RequestMapping("/getCookie2")
    public String cookie(@CookieValue("cdm") String cdm) {
        return "Cookie:" + cdm;
    }

效果:
在这里插入图片描述

3. 2 获取和存储Session

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

Session的存储
代码:

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

解释:

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

效果:

在这里插入图片描述

获取Session

获取Session有两种⽅式:

  1. HttpSession getSession(boolean create);
  2. HttpSession getSession();

HttpSession getSession(boolean create): 参数如果为 true, 则当不存在会话时新建会话; 参数如果为 false, 则当不存在会话时返回 null
HttpSession getSession(): 和getSession(true) 含义⼀样, 默认值为true


3.2.1获取Session(1)使⽤ HttpServletRequest

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

    //获取session
    @RequestMapping("/getSession")
    public String session(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 getAttribute(String name): 返回在该 session 会话中具有指定名称的对象,如果没有指定名
称的对象,则返回 null.

HttpServletRequest request 如果 session 不存在, 不会⾃动创建
在这里插入图片描述

效果:
在这里插入图片描述


3.2.2简洁获取 Session(1) @SessionAttribute(value = “username”,required = false)

代码:

    //获取session
    @RequestMapping("/getSession2")
    public String getSession2(@SessionAttribute(value = "username",required = false)
                        String username) {
        //获取到session字符串,直接返回
        return "username:" + username;
    }

解释:value是:获取username的值,required是:没有Session对象时,不创建,返回null
效果:
在这里插入图片描述


3.2.2简洁获取 Session(2)

代码:

    //获取session
    @RequestMapping("/getSession3")
    public String getSession3(HttpSession session) {
        //获取到session对象
        String username = (String)session.getAttribute("username");
        return "username:" +  username;
    }

解释:HttpSession session获取到session对象
效果:
在这里插入图片描述


4. 获取Header

4.1传统获取 header

获取Header也是从 HttpServletRequest 中获取

效果:
在这里插入图片描述
通过Fiddler观察, 获取的User-Agent是否正确
在这里插入图片描述


4.2简洁获取 Header (@RequestHeader(“User-Agent”) 里面参数是header里面的键值对的Key)

在这里插入图片描述
比如说获取User-Agent:

代码:

    //获取header
    @RequestMapping("/getUserAgent2")
    public String getUserAgent2(@RequestHeader("User-Agent") String userAgent) {
        return "User-Agent" + userAgent;
    }

在这里插入图片描述
再比如获取Host
在这里插入图片描述
好了,今天就到在这里,感谢观看。

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

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

相关文章

(SAST检测规则-1)Android - 权限管理漏洞

所属分类:Android - 权限管理漏洞缺陷详解:应用未正确实施最小权限原则或滥用已声明的权限可能导致敏感信息泄露。例如,恶意代码利用已授予的权限绕过用户授权,访问通讯录、位置、短信等敏感资源。部分开发者还可能滥用权限以执行…

EC2还原快照

EC2还原快照 AWS EC2 磁盘快照 是您 Amazon Elastic Block Store (EBS) 卷在特定时间点的增量备份。您可以使用快照创建 EBS 卷的副本,以便在出现故障时恢复数据或将数据迁移到其他区域。 创建磁盘快照 找到ec2实例挂载的磁盘,直接选择创建快照 等待创建…

oracle RAC各版本集群总结和常用命令汇总

oracle RAC学习 RAC介绍 RAC:高可用集群,负载均衡集群,高性能计算集群 RAC是⼀种⾼可⽤,⾼性能,负载均衡的share-everything的集群 8i:内存融合雏形 内存融合雏形(Oracle Parallel Server)…

【聚类】K-Means 聚类(无监督)及K-Means ++

1. 原理 2. 算法步骤 3. 目标函数 4. 优缺点 import torch import numpy as np import matplotlib.pyplot as plt from sklearn.cluster import KMeans from sklearn.decomposition import PCA import torch.nn as nn# 数据准备 # 生成数据:100 个张量&#xff0c…

智慧银行反欺诈大数据管控平台方案(一)

智慧银行反欺诈大数据管控平台建设方案的核心在于通过整合先进的大数据技术和深度学习算法,打造一个全面、智能且实时的反欺诈系统,以有效识别、预防和应对各类金融欺诈行为。该方案涵盖数据采集、存储、处理和分析的全流程,利用多元化的数据…

搭建业务的性能优化指南

这是一篇搭建业务优化的心路历程,也是写给搭建业务的性能优化指南。 前言 直到今天,淘内的页面大多都迁移到了 SSR,从我们终端平台 - 搭建研发团队的视角看,业务大致可以分为两类 —— 搭建派 和 源码派。 这两者互不冲突&#xf…

【Db First】.NET开源 ORM 框架 SqlSugar 系列

.NET开源 ORM 框架 SqlSugar 系列 【开篇】.NET开源 ORM 框架 SqlSugar 系列【入门必看】.NET开源 ORM 框架 SqlSugar 系列【实体配置】.NET开源 ORM 框架 SqlSugar 系列【Db First】.NET开源 ORM 框架 SqlSugar 系列【Code First】.NET开源 ORM 框架 SqlSugar 系列【数据事务…

搭建私有云存储

1、安装LNMP环境 yum install nginx -y yum install -y nginx mariadb-server php php-fpm php-mysqlnd systemctl restart nginx.service --- 启动Nginx systemctl start mariadb.service ---启动数据库 mysql -e create database lxdb character set utf8 ---创建数据库 my…

YOLO 标注工具 AutoLabel 支持 win mac linux

常见的标注工具,功能基础操作繁琐,无复制粘贴,标签无法排序修改,UI不美观,bug修正不及时,没有集成识别、训练、模型导出… 怎么办呢?AutoLabel它来了 Quick Start 一图胜千言 图像标注 支持YOL…

qt QGraphicsPolygonItem详解

1、概述 QGraphicsPolygonItem是Qt框架中QGraphicsItem的一个子类,它提供了一个可以添加到QGraphicsScene中的多边形项。通过QGraphicsPolygonItem,你可以定义和显示一个多边形,包括其填充颜色、边框样式等属性。QGraphicsPolygonItem支持各…

Linux网络_网络协议_网络传输_网络字节序

一.协议 1.概念 协议(Protocol) 是一组规则和约定,用于定义计算机网络中不同设备之间如何进行通信和数据交换。协议规定了数据的格式、传输方式、传输顺序等详细规则,确保不同设备和系统能够有效地互联互通。 在网络通信中&#…

MySQL查看日志

目录 1. 日志 1.1 错误日志 1.2 二进制日志 1.2.1 介绍 1.2.2 格式 1.2.3 查看 1.2.4 删除 1.3 查询日志 1.4 慢查询日志 1. 日志 1.1 错误日志 错误日志是 MySQL 中最重要的日志之一,它记录了当 mysqld 启动和停止时,以及服务器在运行过…

【深度学习】四大图像分类网络之AlexNet

AlexNet是由Alex Krizhevsky、Ilya Sutskever(均为Hinton的学生)和Geoffrey Hinton(被誉为”人工智能教父“,首先将反向传播用于多层神经网络)在2012年ImageNet图像分类竞赛中提出的一种经典的卷积神经网络。AlexNet在…

MySQL数据库做题笔记

题目链接https://leetcode.cn/problems/invalid-tweets-ii/description/https://leetcode.cn/problems/invalid-tweets-ii/description/ # Write your MySQL query statement below SELECT tweet_id FROM Tweets where LENGTH(content)>140 OR (length(content)-length(rep…

ansible使用说明

将安装包拷贝到主控端主机 在主控端主机安装ansible,sh setup.sh 确认安装成功后,编辑hosts文件(按步骤逐个添加主机组,不要一开始全部配置好) [site-init]下的主机列表为被控制的主机(按照当前ai建模方案…

EDA软件研发的DevOps平台

1:什么是DevOps DevOps是十几年前,在互联网比较火的词,实际上就是ci/cd平台的另外一种说法,核心是说打破研发,测试,运维的边界,能够将整个产品开发的流程快速循环起来,随时可发版&a…

Linux命令进阶·如何切换root以及回退、sudo命令、用户/用户组管理,以及解决创建用户不显示问题和Ubuntu不显示用户名只显示“$“符号问题

目录 1. root用户(超级管理员) 1.1 用于账户切换的系统命令——su 1.2 退回上一个用户命令——exit 1.3 普通命令临时授权root身份执行——sudo 1.3.1 为普通用户配置sudo认证 2. 用户/用户组管理 2.1 用户组管理 2.2 用户管理 2.2.1 …

网络安全-AAA介绍与配置

前言 AAA是Authentication(认证)、Authorization(授权)和Accounting(计费)的简称,它提供了认证、授权、计费三种安全功能。AAA可以通过多种协议来实现,目前华为设备支持基于RADIUS&a…

[ACTF2020 新生赛]BackupFile--详细解析

信息搜集 让我们寻找源文件,目录扫描: 找到了/index.php.bak文件,也就是index.php的备份文件。 后缀名是.bak的文件是备份文件,是文件格式的扩展名。 我们访问这个路径,就会直接下载该备份文件。 我们把.bak后缀删掉…

软考高项经验分享:我的备考之路与实战心得

软考,尤其是信息系统项目管理师(高项)考试,对于众多追求职业提升与专业认可的人士来说,是一场充满挑战与机遇的征程。我在当年参加软考高项的经历,可谓是一波三折,其中既有成功的喜悦&#xff0…