【后端开发】Spring MVC-常见使用、Cookie、Session

文章目录

  • 代码总结
    • 初始化--@RestController、@RequestMapping
    • 传递参数
      • 单参数
      • 多参数
    • 传递对象
    • 后端参数重命名(后端参数映射)--@RequestParam
      • 必传参数
      • 设置非必传参数
    • 传递数组
    • 传递集合
    • 传递JSON数据
      • JSON语法
      • JSON格式转换
      • JSON优点
      • 传递JSON对象
    • 获取URL中参数--@PathVariable
    • 传递文件--@RequestPart
    • 获取HTTP请求中的Header信息--@RequestHeader
    • 传统获取header
    • 简洁获取Header
  • Cookie与Session
    • Cookie
      • Cookie机制
    • Session
    • Cookie与Session交互
    • 常见面试题
      • Cookie 和 Session 的区别
      • Session产生的SessionId放在Cookie里面,如果用户把Cookie禁止掉,是不是Session也不能用了呢?
    • 获取Cookie与session
      • 获取Cookie
        • 传统获取Cookie
        • 简洁获取Cookie
      • 获取Session
        • 设置Session
        • 传统获取Session
        • 简洁获取Session

代码总结

初始化–@RestController、@RequestMapping

@RestController:该注解用于标记一个类作为RESTful Web 服务的控制器
@RequestMapping(“/request”):该注解用于将 HTTP 请求映射到对应的控制器方法上,将特定的 URL 路径(如 “/request”)映射到控制器类或方法。

url路径前加上"/"
建议类路径与方法路径一起使用
RequestMapping即支持get请求,也支持post请求,默认是get请求

@RequestMapping("/request")
@RestController//标记一个类作为RESTful Web 服务的控制器
public class RequestController {//后面这个是url,建立客户端与服务器之间的连接//可以修饰类,也可以修饰方法(修饰类时,访问路径: 类路径+访问路径)@RequestMapping("/hello")public String say(){return "Hello Spring MVC";}
}

在这里插入图片描述

传递参数

单参数

  • 传递单参数时,需要保持方法的参数变量的名称与请求的名称一致。
  • 使用基础类型与包装类型作为接收参数时,当请求为空时,包装类型只为null,基础类型会报出500错误,通常情况下只使用包装类型。
 @RequestMapping("/r1")public String r1(String name){return "接收到参数: "+name;}@RequestMapping("/r2")public String r2(Integer age){return "接收到参数: "+age;}@RequestMapping("/r3")public String r3(int age){return "接收到参数: "+age;}

多参数

当有多个参数时,前后端进⾏参数匹配时,是以参数的名称进⾏匹配的,因此参数的位置是不影响后端获取参数的结果。

@RequestMapping("/r4")public String r4(String name,Integer age){return "接收到参数name="+name+"  age="+age;}

传递对象

  • 如果参数⽐较多时,⽅法声明就需要有很多形参,并且后续每次新增⼀个参数,也需要修改⽅法声明,不妨把这些参数封装为⼀个对象。 Spring
  • 根据参数名称⾃动绑定到对象的各个属性上,如果某个属性未传递,则赋值为null(基本类型在创建对象时赋值为默认初识值,⽐如int类型的属性,会被赋值为0,此时不会报错)
    @RequestMapping("/r5")public String r5(Student student){return "接收到参数student: "+student;}

后端参数重命名(后端参数映射)–@RequestParam

必传参数

@RequestParam:某些特殊的情况下,前端传递的参数key和后端接收的key可以不⼀致,⽐如前端传递了⼀个 name 给后端,而后端是使⽤ username 字段来接收,这样就会出现参数接收不到的情况,如果出现这种情况,使⽤ @RequestParam 来重命名前后端的参数值。

    @RequestMapping("/r6")public String r6(@RequestParam("name") String username){//接收前段的name赋值给后端的usernamereturn "接收到参数student: "+username;}

使⽤ @RequestParam 进⾏参数重命名时,请求参数只能和 @RequestParam 声明的名称一致,才能进⾏参数绑定和赋值。
使⽤ @RequestParam 进⾏参数重命名时,参数就变成了必传参数,也就是接收到为 null ,直接报错。

设置非必传参数

    @RequestMapping("/r7")public String r7(@RequestParam(value = "name",required = false) String username){return "接收到参数student: "+username;}

传递数组

Spring MVC可以⾃动绑定数组参数的赋值。

    @RequestMapping("/r8")public String r8(String[] arrays){return "arrays: "+ Arrays.toString(arrays);}

传递集合

集合参数:和数组类似,同⼀个请求参数名有为多个,且需要使⽤ @RequestParam 绑定参数关系。
这是因为后端不能直接接收集合这样的参数数组,所以先通过数组接收数据,再通过 @RequestParam 映射。

    @RequestMapping("/r9")public String r9(@RequestParam List<String> list){return "arrays: "+ list;}

传递JSON数据

JSON:JavaScriptObjectNotation 【JavaScript 对象表示法】
JSON是⼀种轻量级的数据交互格式,它基于ECMAScript(欧洲计算机协会制定的js规范)的⼀个⼦集,采⽤完全独⽴于编程语⾔的⽂本格式来存储和表示数据。

JSON是⼀种数据格式,有⾃⼰的格式和语法,使⽤⽂本表示⼀个对象或数组的信息,因此JSON本质是字符串。

JSON语法

数据在键值对(Key/Value) 中
数据由逗号 , 分隔
对象⽤ {} 表⽰
数组⽤ [] 表⽰
值可以为对象,也可以为数组,数组中可以包含多个对象

示例:

{"name":"zhangsan","id":1111,"age":22
}

JSON格式转换

工具:https://www.bejson.com/,可以对JSON字符串进行压缩整理。
将上述JSON字符串进行压缩:

{"name":"zhangsan","age":12,"id":1111}

JSON本质上是⼀个字符串,通过⽂本来存储和描述数据。
Spring MVC框架也集成了JSON的转换⼯具,可以直接使用,来完成JSON字符串和Java对象的互转。

    public static void main(String[] args) throws JsonProcessingException {ObjectMapper objectMapper = new ObjectMapper();String jsonstr = "{\"name\":\"zhangsan\",\"age\":12,\"id\":1111}";//json字符串转对象,使用该方法时,类中必须要有无参数的构造函数Student student = objectMapper.readValue(jsonstr,Student.class);System.out.println(student);//对象转json字符串String s= objectMapper.writeValueAsString(student);System.out.println(s);}

JSON优点

  1. 简单易用:语法简单,易于理解和编写,可以快速地进⾏数据交换
  2. 跨平台⽀持:JSON可以被多种编程语⾔解析和生成,可以在不同的平台和语⾔之间进⾏数据交换和传输
  3. 轻量级:相较于XML格式,JSON数据格式更加轻量级,传输数据时占用宽带较小,可以提⾼数据传输速度
  4. 易于扩展:JSON的数据结构灵活,支持嵌套对象和数组等复杂的数据结构,便于扩展和使用
  5. 安全性:JSON数据格式是⼀种纯文本格式,不包含可执⾏代码,不会执⾏恶意代码,因此具有较⾼的安全性

传递JSON对象

接收JSON对象,需要使⽤ @RequestBody 注解。
RequestBody:请求正⽂,意思是这个注解作⽤在请求正⽂(body)的数据绑定,请求参数必须在写在请求正⽂中。
json格式字符串就在body(请求正文)中。

	@RequestMapping("/r10")public String r10(@RequestBody Student student) {return "接收到参数student: " + student;}

获取URL中参数–@PathVariable

@PathVariable:该注解主要作⽤在请求URL路径上的数据绑定,默认传递参数写在URL上,SpringMVC就可以获取到。

    @RequestMapping("/article/{articleId}")public String r11(@PathVariable("articleId") Integer articleId){//@PathVariable从url中获取参数return "接收到参数articleId: " + articleId;}@RequestMapping("/article/{articleId}/{name}")public String r12(@PathVariable("articleId") Integer articleId,@PathVariable("name") String name){return "接收到参数articleId: " + articleId + " name: " + name;}

传递文件–@RequestPart

@RequestPart(“file”) 也是起到类似于赋值的功能

    @RequestMapping("/r13")public String r13(@RequestPart("file") MultipartFile file) {//@RequestPart("file") 也是起到类似于赋值的功能String originalFilename = file.getOriginalFilename();return "接收文件,原始名称: " + originalFilename;}

获取HTTP请求中的Header信息–@RequestHeader

传统获取header

获取Header也是从 HttpServletRequest 中获取,使用 HttpServletRequest 提供的getHeader方法来获取,参数对应HTTP请求报头的 Key 。

    @RequestMapping("/getHeader")public String getHeader(HttpServletRequest request) {String userAgent = request.getHeader("User-Agent");return "从header中获取信息,useragent: "+userAgent;}

简洁获取Header

@RequestHeader 注解的参数值为HTTP请求报头中的 Key。

    @RequestMapping("/getHeader2")public String getHeader2(@RequestHeader("User-Agent") String userAgent) {return "从header中获取信息,useragent: "+userAgent;}

Cookie与Session

Cookie

Cookie,其实就是储存在用户本地终端上的数据(通常经过加密),由用户计算机暂时或永久保存的信息,类型为“小型文本文件”。

可以理解是某些网站为了辨别用户身份,进行Session跟踪而储存在用户本地终端上的数据。

Cookie机制

HTTP是无状态的,不能保存每次提交的信息,如果用户发来一个新请求,服务器无法知道它是否与上次的请求有联系。

cookie的出现就是为了解决这个问题
登录后服务器返回一些数据(cookie)给浏览器,然后浏览器保存在本地,当该用户再次发送请求的时候,就会自动的把上次请求存储的cookie数据自动的携带给服务器,服务器通过浏览器携带的数据就能判断当前用户的状态。
在这里插入图片描述

此时在服务器这边就需要记录"令牌"信息,以及令牌对应的用户信息,这个就是 Session 机制所做的工作。

Session

Session–回话、对话:在计算机领域,会话是⼀个客户与服务器之间的不中断的请求响应,当客户明确结束会话或服务器在⼀个时限内没有接受到客⼾的任何请求时,会话就结束了。

服务器同⼀时刻收到的请求是很多的,服务器需要清楚的区分每个请求是从属于哪个客户,也就是属于哪个会话,就需要在服务器这边记录每个会话以及与客户的信息的对应关系。
在这里插入图片描述

Session是服务器是为了保存用户信息⽽创建的⼀个特殊的对象。
Session的本质就是⼀个 “哈希表”,存储了⼀些键值对结构,Key 就是SessionID,Value 就是⽤户信息(⽤户信息可以根据需求灵活设计)。
SessionId 是由服务器⽣成的⼀个 “唯⼀性字符串”,从 Session 机制的⻆度来看,这个唯⼀性字符串称为 “SessionId”,但是站在整个登录流程中看待,也可以把这个唯⼀性字符串称为 “token”。

Cookie与Session交互

  1. 当用户登录的时候,服务器在 Session 中新增⼀个新记录,并把 sessionId 返回给客⼾端(通过 HTTP 响应中的
    Set-Cookie 字段返回) 。
  2. 客户端后续再给服务器发送请求的时候,需要在请求中带上 sessionId(通过 HTTP 请求中的 Cookie 字段带上)。
  3. 服务器收到请求之后,根据请求中的 sessionId在 Session 信息中获取到对应的用户信息,再进⾏后续操作,找不到则重新创建 Session ,并把SessionID返回。
    在这里插入图片描述
  1. Session 默认是保存在内存中的,如果重启服务器则 Session 数据就会丢失。
  2. 同一客户端启动二次session_start的话,session_id是不一样的。

常见面试题

Cookie 和 Session 的区别

Cookie 是客户端保存用户信息的⼀种机制,Session 是服务器端保存用户信息的⼀种机制。
Cookie 和Session之间主要是通过 SessionId 关联起来的,SessionId 是 Cookie 和 Session 之间的桥梁。
Cookie 和 Session 经常会在⼀起配合使⽤,但是不是必须配合。
Session 中的 sessionId 也不需要非得通过 Cookie/Set-Cookie 传递,比如通过URL传递。

Session产生的SessionId放在Cookie里面,如果用户把Cookie禁止掉,是不是Session也不能用了呢?

禁止掉cookie后,session当然可以用,不过通过其他的方式来获得这个sessionid,比如,可以跟在url的后面,或者以表单的形势提交到服务器端,从而使服务器端了解客户端的状态。

获取Cookie与session

获取Cookie

传统获取Cookie

Spring MVC是基于 Servlet API 构建的原始 Web 框架,也是在Servlet的基础上实现的。HttpServletRequest , HttpServletResponse 是Servlet提供的两个类,是 Spring MVC 的内置对象,要时直接在⽅法中添加声明即可。
HttpServletRequest 对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象提供的⽅法,可以获得客户端请求的所有信息。
HttpServletResponse 对象代表服务器的响应,HTTP响应的信息都在这个对象中,⽐如向客户端发送的数据,响应头、状态码等,通过这个对象提供的⽅法,可以获得服务器响应的所有内容。

该方法通过遍历 request 中所有 Cookie 得到一个 cookies数组。

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

此时没有设置Cookie,通过浏览器访问:http://127.0.0.1:8080/getC ,得到Cookie为null
通过PostMan可以设置⼀下Cookie的值,进而进行测试。
在这里插入图片描述

简洁获取Cookie

@CookieValue(“Cookie_1”)只能获取Cookie数组中某个指定cookie,这里指定的是刚才通过PostMan创建的Cookie。

    @RequestMapping("/getC2")public String getCookie2(@CookieValue("Cookie_1") String cookie) {return "从Cookie中获取值,cookie"+cookie;}

获取Session

设置Session

Session是服务器端的机制,需要先存储,才能再获取。
该方法创建了一个Session----SessionId : {name:zhangsan}。

    @RequestMapping("/setSess")public String setSession(HttpServletRequest request) {//从Cookie中获取到了sessionID,根据senssionID获取session对象,如果没有获取到,会创建一个session对象HttpSession session = request.getSession();session.setAttribute("name","zhangsan");return "设置session成功";}
传统获取Session

Object getAttribute(String name):返回在该 session 会话中具有指定名称的对象,如果没有指定名称的对象,则返回null。
该方法返回服务器端name的信息。

    @RequestMapping("/getSess")public String getSession(HttpServletRequest request) {//从Cookie中获取到了sessionID,根据senssionID获取session对象HttpSession session = request.getSession();String name = (String)session.getAttribute("name");return "从session中获取name: "+name;}
简洁获取Session
@RequestMapping("getSess2")public String getSession(HttpSession session) {String name = (String) session.getAttribute("name");return "name:" + name;}

上述方法虽然很简洁,但是Spring封装了更为简洁的方法。
通过@SessionAttribute(“name”)这个注解来获取session对象的name。

    @RequestMapping("/getSess3")public String getSession3(@SessionAttribute("name") String name) {return "从session中获取name: "+name;}

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

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

相关文章

青少年编程考试 CCF GESP Python七级认证真题 2025年3月

Python 七级 2025 年 03 月 题号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 答案 B C A B B A A B C A B B A B A 1 单选题&#xff08;每题 2 分&#xff0c;共 30 分&#xff09; 第 1 题 下列哪个选项是python中的关键字&#xff1f; A. function B. class C. method D. object…

Vue 框架组件间通信方式

组件间通信方式 不管是 vue2 还是 vue3&#xff0c;组件通信方式很重要&#xff0c;以下是常见的几种通信方式&#xff1a; props&#xff1a;可以实现父子组件、子父组件、甚至兄弟组件通信自定义事件&#xff1a;可以实现子父组件通信全局事件总线 $bus&#xff1a;可以实现…

SpringBoot学生成绩管理系统设计与实现

概述 幽络源本次分享的基于SpringBoot的学生成绩管理系统项目&#xff0c;采用主流的Java技术栈开发&#xff0c;实现了从学生信息管理到成绩统计分析的全流程数字化管理。 主要内容 管理员功能模块 ​​学生信息管理​​&#xff1a;维护学生基本信息档案&#xff0c;支持…

青少年编程与数学 02-016 Python数据结构与算法 01课题、算法

青少年编程与数学 02-016 Python数据结构与算法 01课题、算法 一、算法的定义二、算法的设计方法1. 分治法2. 动态规划法3. 贪心算法4. 回溯法5. 迭代法6. 递归法7. 枚举法8. 分支定界法 三、算法的描述方法1. **自然语言描述**2. **流程图描述**3. **伪代码描述**4. **程序设计…

Java 实现冒泡排序:[通俗易懂的排序算法系列之二]

引言 大家好!欢迎来到我的排序算法系列第二篇。今天,我们将学习另一种非常基础且广为人知的排序算法——冒泡排序 (Bubble Sort)。 冒泡排序的名字非常形象,它模拟了水中气泡上升的过程:较小(或较大)的元素会像气泡一样,通过不断交换,逐渐“浮”到数组的一端。 什么是…

struct结构体、union联合体和枚举

目录 一、结构体的声明和使用 1.1 结构体正常声明和创建 1.2 结构体特殊声明 1.3 结构体的自引用 二、结构体内存对齐 2.1 对齐规则 2.2 #pragma修改 三、结构体传参 四、结构体位段 4.1 位段内存分配 4.2 位段内存应用 五、结构体中的柔性数组概念 六、union联合…

大模型本地部署系列(2) Ollama部署DeepSeek-R1

成功运行截图 部署步骤 我们进入到ollama的官网&#xff1a; Ollama​ollama.com/​编辑 找到上方的Models &#xff0c;然后点击 此时会跳转到模型列表页面&#xff1a; 点击 deepseek-r1 链接进去&#xff0c;此时我们会看到下拉框中有各个版本的大模型&#xff0c;越往后…

绘制动态甘特图(以流水车间调度为例)

import matplotlib.pyplot as plt import matplotlib.animation as animation import numpy as np from matplotlib import cm# 中文字体配置&#xff08;必须放在所有绘图语句之前&#xff09; plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] Fa…

PyTorch实现线性回归的基础写法与封装API写法

目录 1. 基础写法 1.1导包 2.2加载读取数据 2.3原始数据可视化(画图显示) 2.4线性回归的(基础)分解写法 2.5定义训练过程 2.PyTorch实现 线性回归的封装写法(实际项目中的常用写法) 2.1创建线性回归模型 2.2定义损失函数 2.3定义优化器 2.4定义训练过程 1…

python 常用的6个爬虫第三方库

Python中有非常多用于网络数据采集的库&#xff0c;功能非常强大&#xff0c;有的用于抓取网页&#xff0c;有的用于解析网页&#xff0c;这里介绍6个最常用的库。 1. BeautifulSoup BeautifulSoup是最常用的Python网页解析库之一&#xff0c;可将 HTML 和 XML 文档解析为树形…

基于BP神经网络的杂草智能识别系统(杂草识别、Python项目)

基于BP神经网络的杂草智能识别系统 项目介绍 本项目是一个基于PyQt5和BP神经网络的杂草智能识别系统。系统通过图像处理和神经网络技术&#xff0c; 能够识别8种不同的杂草类别。用户可以通过上传图片&#xff0c;系统会自动识别图片中的杂草类别&#xff0c;并显示识别结果和…

Python3笔记之号称替代pip的uv包管理器

uv是什么&#xff1f; uv&#xff0c;这是一个由 Astral 团队开发的极快速的Python包和项目管理工具&#xff0c;用Rust语言编写。它集成了多种功能&#xff0c;旨在替代pip、pip-tools、pipx、poetry、pyenv、twine、virtualenv等多个工具&#xff0c;提供更高效、更全面的Py…

IT管理思路

甲方CIO和IT管理者-如何做好组织级IT能力提升_哔哩哔哩_bilibili

ChatGPT的GPT-4o创建图像Q版人物提示词实例展示

最近感觉GPT-4o发布的新功能真的强大&#xff0c;所以总结了一些提示词分享给大家&#xff0c;大家可以去试试&#xff0c;玩法多多&#xff0c;可以用GPT-4o生成图片&#xff0c;然后用可灵进行图生视频&#xff0c;就能去发布视频了&#xff01;接下来和笔者一起来试试&#…

Transformer Decoder Block的几个优化方案

写在前面 在大型语言模型(LLM)的演进浪潮中,Transformer 架构凭借其强大的并行计算能力和对长距离依赖的出色捕捉,奠定了核心地位。然而,标准的 Transformer Decoder Block 遵循着一种相对固定的模式:先进行自注意力(Self-Attention)捕捉上下文信息,再通过前馈神经网…

五种IO模型与select和poll分别实现多路转接

五种IO模型与select和poll分别实现多路转接 何为IO 不论是在前面文件部分&#xff0c;还是后面的网络部分&#xff0c;IO都是非常常见的。但是当时只是简单对IO进行提及&#xff0c;并没有对IO的本质进行介绍。那么到底何为IO&#xff1f;IO全称为输入和输出&#xff0c;而任…

单例模式的写法(保证线程安全)

1. 引言 1.1 什么是单例模式&#xff1f; 单例模式&#xff08;Singleton Pattern&#xff09;是一种创建型设计模式&#xff0c;它确保一个类只有一个实例&#xff0c;并提供一个全局访问点。 核心思想&#xff1a;控制实例化过程&#xff0c;避免重复创建对象。 1.2 为什么…

C++ 环境设置

C++ 环境设置 引言 C++作为一种高性能的编程语言,广泛应用于系统软件、游戏开发、实时系统等领域。为了能够顺利进行C++编程,我们需要在计算机上配置合适的开发环境。本文将详细讲解如何在Windows、macOS和Linux系统中设置C++开发环境。 Windows系统下C++环境设置 1. 安装…

【Kafka基础】ZooKeeper在Kafka中的核心作用:分布式系统中枢神经系统

在分布式系统的世界里&#xff0c;协调和管理多个节点间的状态是一项复杂而关键的任务。Apache Kafka作为一款高性能的分布式消息系统&#xff0c;其设计哲学是"专为单一目的而优化"——即高效处理消息流。为了实现这一目标&#xff0c;Kafka选择将集群协调管理的重任…

<《AI大模型应知应会100篇》第8篇:大模型的知识获取方式及其局限性

第8篇&#xff1a;大模型的知识获取方式及其局限性 摘要 大模型&#xff08;如GPT、BERT、Qwen、DeepSeek等&#xff09;凭借其卓越的自然语言处理能力&#xff0c;已经成为人工智能领域的明星。然而&#xff0c;这些模型“知道”什么&#xff1f;它们如何获取知识&#xff1f…