当前位置: 首页 > article >正文

Spring Web MVC————入门(2)

1,请求

我们接下来继续讲请求的部分,上期将过很多了,我们来给请求收个尾。

还记得Cookie和Seesion吗,我们在HTTP讲请求和响应报文的时候讲过,现在再给大家讲一遍,我们HTTP是无状态的协议,这次的请求和下次的通信是没有直接联系的,我们登录网站的时候我们是应该在这一段时间内只用登录一次的,而不是刷新一下就得登录,访问一下就得登录,那谁还使用呀,那我们怎么做到只用登录一次并且你传输过来的请求报文我还能识别出来是你呢:

首先用户发起登录请求,浏览器拿着请求给服务器,服务器校验用户名和密码,一旦成功,服务器就会创建一个Seesion对象(会话)和唯一的SeesionID,把他俩关联起来,并把他们存储在数据库或者缓存中,并通过响应报头设置set-cookie把SeesionID放到里面,浏览器接收响应会保留Cookie,之后每个同域的请求,浏览器都会携带着Cookie,在用户后续的请求中,服务器通过解析请求中的Cookie获取Session ID,并与服务器存储的会话信息比对,以确认用户身份,维持登录状态。

1)获取Cookie

我们先来学习如何获取Cookie

1,传统方法获取Cookie,我们可以使用HttpServletRequest来获取Cookie,虽然这个东西很老了,但是还是很实用的,我们如果使用注解的话只能就一个参数获取一个Cookie,而HttpServletRequest可以获取所有关于请求报文的属性,比如之前学的方法呀,Header啊,与之对应的还有HttpServletResponse,可以获得响应报文,话不多说,来上代码,

@RequestMapping("/Argu")
@RestController
public class Argu {@RequestMapping("/getCookie1")public String getCookie1(HttpServletRequest httpServletRequest){Cookie[] cookies = httpServletRequest.getCookies();if(cookies!=null){for(Cookie cookie: cookies){System.out.println(cookie.getName()+"   "+ cookie.getValue());}}return "获取Cookie成功";}
}

我使用postman发起请求,别把工具忘了, 

右边样、这有个Cookies,我们输入http://127.0.0.1:8080/这样就能给postman发给我们的模拟请求都带上Cookie了, 

发送:

我们拿到了我们设置的Cookie,

我们还可以使用注解的方式获取Cookie,

    @RequestMapping("/getCookie2")public String getCookie2(@CookieValue("name") String name){return name;}

 注解是真牛逼,但是只能获取一个,真的吗?

    @RequestMapping("/getCookie3")public String getCookie3(@CookieValue("name") String name,@CookieValue("age") String age){return "第一个Cookie的Value"+name+",第二个Cook的Value"+age;}

多写几个参数不就行了,这有一点不太好的就是使用HttpServletRequest不会那么多,懂我意思不,注解写起来可能会巨多,但是根据场景我们可以进行不同的选择; 

2)获取和设置Seesion

我们先来设置Seesion:

我们怎么设置Seesion呢,我们假设用户已经登录过了,我们看看来创建会话(Session对象)有着对应的SessionID,之后我们把用户的用户名存到Session中,来上代码:

@RequestMapping("/Argu2")
@RestController
public class Argu2 {@RequestMapping("/setSession")public String setSession(HttpServletRequest httpServletRequest){HttpSession httpSession = httpServletRequest.getSession();httpSession.setAttribute("name","zhangsan");httpSession.setAttribute("age",18);return "设置Session成功";}
}

这个新的Session是HttpSession的机制,不必理会,我们怎么看到我们设置的Session呢,看不到嗷,我们得通过获取Session,这个是服务端的,我们存储在内存或数据库中,我们刚才的操作就相当于Set-Cookie嗷;

我们来写获取Session的代码:

    @RequestMapping("/getSession")public String getSession(HttpServletRequest httpServletRequest){HttpSession httpSession = httpServletRequest.getSession(false);//这个就相当如果用户登录了,那么Session是有值的,如果没登录那么就是nullif(httpSession==null){return "用户未登录";}else{String username = (String) httpSession.getAttribute("name");Integer age = (Integer) httpSession.getAttribute("age");return "用户名为:"+username+"密码为:"+age;}}

前提是我们设置过Session才能获取到;

我们还有两种方法来获取Session;

    @RequestMapping("/getSession2")public String getSession2(HttpSession httpSession){String username = (String) httpSession.getAttribute("name");return username;}

 还有通过注解的方式:

    @RequestMapping("/getSession3")public String getSession3(@SessionAttribute("name") String name){return name;}

注解就是爽嗷: 

3)获取Header

依旧是两个方法,

    @RequestMapping("/getHeader")public String getHeader(HttpServletRequest httpServletRequest){String host = httpServletRequest.getHeader("Host");return host;}

还可以使用注解的方法:

    @RequestMapping("/getHeader2")public String getHeader2(@RequestHeader("Host") String host){return host;}

 我们可以看看Fiddler的抓包:

可以看到Host是对哒; 


2,响应

我们之前写的响应都是返回字符串,那我们还可以返回什么呢,我们还能返回页面,文本,json,html等等,还记得RequestController吗,我们看下源码:

我们可以看到@RequestController包含@Controller和@ResponseBody,这两个注解什么意思呢,@Controller是返回视图,比如我们返回"/login.html",此时就不会返回字符串了,而是返回一个html页面,这个@ResponseBody的意思就是返回数据了,所以我们直接使用RequestController就是直接返回数据了;

1,返回静态页面,返回视图

我们先来返回前端页面的代码:

我们要把前端代码放到静态资源这里:

<body><h1>计算器</h1>数字1:<input name="num1" type="text" id="num11"><br>数字2:<input name="num2" type="text" id="num22"><br><input type="submit" value=" 点击相加 " onclick="hei()"><br><span id="result"></span>
<script>function onclick() {$.ajax({type:"get",url:"CalcController/Calc",data:{num1: $("#num11").val(),num2: $("#num22").val()},success: function (result){if(result==null){alert("参数出错了")}else{$("#result").html(result);}}})}
</script>
</body>

 还是用这个前端代码,

@RequestMapping("/Argu3")
@Controller
public class Argument {@RequestMapping("/getHtml")public String getHtml(){return "/calc.html";}
}

 

并没有返回字符串而是前端界面。

我们还可以设置参数来选择自己要返回什么:

produces = "application/json"      // 返回 JSON 数据
produces = "text/html"             // 返回 HTML 内容
produces = "text/plain"            // 返回纯文本
produces = "application/xml"       // 返回 XML 数据
produces = "image/png"             // 返回 PNG 图片

我们从网上找的几个常用的,我们来上代码:

     @RequestMapping(value = "/getHtml3", produces = "text/html")@ResponseBodypublic String getHtml3(){return "<h1>我是一级标题</h1>";}

来看结果:

 

返回的是Html,

    @RequestMapping(value = "/getHtml2", produces = "text/plain")@ResponseBodypublic String getHtml2(){return "<h1>我是一级标题</h1>";}

 

 返回的就是文本了;

2,返回数据

我们在有@Controller注解的前提下加上@ResponseBody就能返回数据了

    @RequestMapping("/getData")@ResponseBodypublic String getData(){return "/calc.html";}

 

3,返回json和接收json

先来返回json:

@Data
public class UseInfo {private String name;private Integer age;
}

 返回json就是返回对象,Spring会自动把我们返回的对象变成json,我们创建完对象用lombok,

    @RequestMapping(value = "/returnJson" ,produces = "application/json")@ResponseBodypublic UseInfo return_json(){UseInfo useInfo = new UseInfo();useInfo.setName("zhangsan");useInfo.setAge(18);return useInfo;}

 

4,设置状态码

    @RequestMapping(value = "/setStatus" ,produces = "application/json")@ResponseBodypublic UseInfo setStatus(HttpServletResponse httpServletResponse){UseInfo useInfo = new UseInfo();useInfo.setName("zhangsan");useInfo.setAge(18);httpServletResponse.setStatus(404);return useInfo;}

我们来试试抓包:

 

 

拿到了也是404,治好了也是流口水,哈哈,这后面有用; 

5,设置Header

    @RequestMapping("/setHeader")@ResponseBodypublic String setHeader(HttpServletResponse httpServletResponse){httpServletResponse.setHeader("name","zhangsan");return "设置Header成功";}

抓包看看:

 

我们还可以设置其他属性;

今天就到这了哈,下期继续;

相关文章:

Spring Web MVC————入门(2)

1&#xff0c;请求 我们接下来继续讲请求的部分&#xff0c;上期将过很多了&#xff0c;我们来给请求收个尾。 还记得Cookie和Seesion吗&#xff0c;我们在HTTP讲请求和响应报文的时候讲过&#xff0c;现在再给大家讲一遍&#xff0c;我们HTTP是无状态的协议&#xff0c;这次的…...

Python知识框架

一、Python基础语法 变量与数据类型 变量命名规则 基本类型&#xff1a;int, float, str, bool, None 复合类型&#xff1a;list, tuple, dict, set 类型转换与检查&#xff08;type(), isinstance()&#xff09; 运算符 算术运算符&#xff1a;, -, *, /, //, %, ** 比较…...

每日算法-250514

每日算法学习记录 (2024-05-14) 今天记录三道 LeetCode 算法题的解题思路和代码。 1. 两数之和 题目截图: 解题思路 这道题要求我们从一个整数数组中找出两个数&#xff0c;使它们的和等于一个给定的目标值 target&#xff0c;并返回这两个数的下标。 核心思路是使用 哈希…...

嵌入式培训之数据结构学习(三)gdb调试、单向链表练习、顺序表与链表对比

目录 一、gdb调试 &#xff08;一&#xff09;一般调试步骤与命令 &#xff08;二&#xff09;找段错误&#xff08;无下断点的地方&#xff09; &#xff08;三&#xff09;调试命令 二、单向链表练习 1、查找链表的中间结点&#xff08;用快慢指针&#xff09; 2、找出…...

虚拟机安装CentOS7网络问题

虚拟机安装CentOS7网络问题 1. 存在的问题1.1 CentOS7详细信息 2. 解决问题3.Windows下配置桥接模式 1. 存在的问题 虽然已经成功在虚拟机上安装了CentOS7&#xff0c;但是依旧不能上网。 1.1 CentOS7详细信息 [fanzhencentos01 ~]$ hostnamectlStatic hostname: centos01Ic…...

零基础学Java——终章:核心知识点与面试总结

Java核心知识点与面试总结 本文档旨在总结Java的核心知识点&#xff0c;并提供常见的面试问题与解答&#xff0c;帮助学习者巩固知识和准备面试。 目录 零基础学Java——大纲合集 Java基础 1. Java概述 JDK (Java Development Kit): Java开发工具包&#xff0c;包含Java的…...

迅为RK3588开发板安卓GPIO调用APP运行测试

将网盘上的安卓工程文件复制到 Windows 电脑上。确保工程路径中使用英文字符&#xff0c;不包含中文。接着&#xff0c;启动 Android Studio&#xff0c;点击“Open”按钮选择应用工程文件夹&#xff0c;然后点击“OK”。由于下载 Gradle 和各种 Jar 包可能需要一段时间&#x…...

在一台CentOS服务器上开启多个MySQL服务

1. 创建目录 mkdir -p /data/mysql3307/{data,tmp,logs} # 赋权 chown -R mysql:mysql /data/mysql3307 chmod -R 750 /data/mysql3307 2.修改 /etc/my.cnf &#xff0c;添加[mysqld3307]实例配置组 [mysqld3307] # mysql服务的端口 port 3307 # 套接字文件存放路径 socket /…...

C#高级编程:IO和序列化

在 C# 编程中,输入输出(IO)和序列化是两个至关重要的概念,它们为数据的存储、读取以及在不同环境间的传输提供了强大的支持。无论是开发小型应用程序,还是构建复杂的企业级系统,深入理解并熟练运用 IO 和序列化技术都是必不可少的。​ 一、C# 中的 IO 基础​ 1、文件流…...

Unity 红点系统

首先明确一个&#xff0c;即红点系统的数据结构是一颗树&#xff0c;并且红点的数据结构的初始化需要放在游戏的初始化中&#xff0c;之后再是对应的红点UI侧的注册&#xff0c;对应的红点UI在销毁时需要注销对红点UI的显示回调注册&#xff0c;但是不销毁数据侧的红点注册 - …...

尼康VR镜头防抖模式NORMAL和ACTIVE的区别(私人笔记)

1. NORMAL 模式&#xff08;常规模式&#xff09; 适用场景&#xff1a;一般手持拍摄&#xff0c;比如人像、静物、风景或缓慢平移镜头&#xff08;如水平追拍&#xff09;等。工作特性&#xff1a; 补偿手抖引起的小幅度震动&#xff08;比如手持时自然的不稳&#xff09;&am…...

JMeter 中通过 WebSocket (WS) 协议发送和接收 Protocol Buffers (Proto) 消息

在 JMeter 中通过 WebSocket (WS) 协议发送和接收 Protocol Buffers (Proto) 消息&#xff0c;需要使用 JMeter WebSocket 插件&#xff0c;并结合 JSR223 脚本处理 Proto 的序列化和反序列化。以下是完整步骤&#xff1a; 1. 准备工作 1.1 安装 WebSocket 插件 下载插件&…...

从索引中排除 Elasticsearch 字段

作者&#xff1a;来自 Elastic Kofi Bartlett 说明如何配置 Elasticsearch 排除字段、为什么要这样做&#xff0c;以及应遵循的最佳实践。 更多阅读&#xff1a;Elasticsearch&#xff1a;inverted index&#xff0c;doc_values 及 source 想获得 Elastic 认证&#xff1f;了解…...

【Android】文件分块上传尝试

【Android】文件分块上传 在完成一个项目时&#xff0c;遇到了需要上传长视频的场景&#xff0c;尽管可以手动限制视频清晰度和视频的码率帧率&#xff0c;但仍然避免不了视频大小过大的问题&#xff0c;且由于服务器原因&#xff0c;网络不太稳定。这个时候想到了可以将文件分…...

超详细Docker教程

前言&#xff1a;大家在在Linux上部署mysql及其他软件时&#xff0c;大家想一想自己最大的感受是什么&#xff1f; 我相信&#xff0c;除了个别天赋异禀的人以外&#xff0c;大多数人都会有相同的感受&#xff0c;那就是麻烦。核心体现在三点&#xff1a; 命令太多了&#xff…...

Java项目拷打(外卖+点评)

一、点评星球&#xff08;黑马点评&#xff09; 1、项目概述 1.1、项目简介 本项目是基于Spring Boot与Redis深度整合的前后端分离的点评平台。系统以Redis为核心技术支撑&#xff0c;重点解决高并发场景下的缓存穿透、击穿、雪崩等问题&#xff0c;涵盖商户展示、优惠券秒杀…...

hadoop中了解yarm

Hadoop中的YARN&#xff08;Yet Another Resource Negotiator&#xff09;是一种新的Hadoop资源管理器&#xff0c;是一个通用资源管理系统&#xff0c;可为上层应用提供统一的资源管理和调度。以下是其相关介绍&#xff1a; 核心思想 将JobTracker的资源管理和作业调度/监控功…...

Android usb网络共享详解

Android usb网络共享详解 文章目录 Android usb网络共享详解一、前言二、USB网络共享使用的前提1、Android设备支持adb 并且打开usb开关2、原生Settings能看到USB网络共享开关3、代码中检测USB网络共享是否支持 三、Settings 中USB网络共享代码的部分代码1、Settings\res\xml\t…...

【数据库知识】Mysql进阶-高可用MHA(Master High Availability)方案

mysql高可用MHA&#xff08;Master High Availability&#xff09;方案 集群部署模式下的高可用方案一、高可用架构原理1. 核心组件2. 故障切换流程 二、详细部署步骤 (3节点集群)1. 环境准备2. 节点配置&#xff08;以 node1 为例&#xff09;3. 初始化集群4. 部署MySQL Route…...

Web 架构之会话保持深度解析

文章目录 一、引言二、会话保持的基本概念2.1 什么是会话2.2 为什么需要会话保持 三、会话保持的常见实现方式3.1 基于客户端的会话保持3.1.1 Cookie 方式3.1.2 URL 重写方式 3.2 基于服务器端的会话保持3.2.1 负载均衡器会话保持3.2.2 会话共享 四、会话保持可能遇到的问题及解…...

微信小程序仿淘宝拍照/照片点位识图、点位裁剪生图、图片裁剪组件、图片点位框选、裁剪生成图片,canvasToImg

实现效果 效果&#xff1a; 1.微信小程序仿淘宝拍照/照片点位识图、根据点位裁剪生图、图片可裁剪、图片高度可控 2.识别点位自动生成标准构图方案&#xff0c;支持手动微调实现像素级精准裁剪 3.可以根据接口识别的点位信息实现拍照/相册图片特征点自动识别并裁剪 实现步骤 …...

attention_weights = torch.ones_like(prompt_embedding[:, :, 0]):切片操作获取第二维度,第三维度

attention_weights = torch.ones_like(prompt_embedding[:, :, 0]):切片操作获取第1 维度,第二维度 attention_weights = torch.ones_like(prompt_embedding[:, :, 0]) 这行代码的作用是创建一个与 prompt_embedding[:, :, 0] 形状相同且所有元素都为 1 的张量,它用于初始化…...

Rust入门之高级Trait

Rust入门之高级Trait - 本文源码 引言 前面学习了迭代器&#xff08;Iterators&#xff09;&#xff0c;Iterator源码中就用到了关联类型的功能。关联类型就属于高级trait的内容&#xff0c;这次我们学习一下高级trait&#xff0c;了解关联类型等知识。关联类型看似和泛型相…...

从 Set、Map 到 WeakSet、WeakMap 的进阶之旅

在 ES5 时代&#xff0c;JavaScript 的数据结构主要依赖于两种类型&#xff1a;数组和对象。然而&#xff0c;随着应用规模的增长和复杂性上升&#xff0c;传统的数据结构越来越难以满足开发需求。比如&#xff0c;需要一个能自动去重的集合、一个支持任意类型键名的字典、一个…...

TTL (Time-To-Live) 解析

文章目录 TTL (Time-To-Live) 解析&#xff1a;网络与Java中的应用一、TTL的定义二、TTL在网络中的应用1. **路由和数据包的生命周期**2. **DNS中的TTL**3. **防止环路** 三、TTL在Java中的应用1. **缓存管理**2. **Java中的ThreadLocal**3. **网络通信中的TTL** 四、TTL的注意…...

Qt/C++开发监控GB28181系统/录像文件查询/录像回放/倍速播放/录像文件下载

一、前言 搞定了实时预览后&#xff0c;另一个功能就是录像回放&#xff0c;录像回放和视频点播功能完全一致&#xff0c;唯一的区别就是发送点播的sdp信息中携带了开始时间和结束时间&#xff0c;因为是录像文件&#xff0c;所以有这个时间&#xff0c;而实时视频预览这个对应…...

季报中的FPGA行业:U型反转,春江水暖

上周Lattice,AMD两大厂商相继发布2025 Q1季报,尽管恢复速度各异,但同时传递出FPGA行业整体回暖的复苏信号。 5月5日,Lattice交出了“勉强及格”的答卷,报告季度营收1亿2000万,与华尔街的预期基本相符。 对于这家聚焦在中小规模器件的领先厂商而言,按照其CEO的预期,长…...

嵌入式机器学习平台Edge Impulse图像分类 – 快速入门

陈拓 2025/05/08-2025/05/11 1. 简介 官方网址 https://edgeimpulse.com/ 适用于任何边缘设备的人工智能&#xff1a; Gateways - 网关 Sensors & Cameras - 传感器和摄像头 Docker Containers - Docker容器 MCUs, NPUs, CPUs, GPUs 构建数据集、训练模型并优化库以…...

web 自动化之 yaml 数据/日志/截图

文章目录 一、yaml 数据获取二、日志获取三、截图 一、yaml 数据获取 需要安装 PyYAML 库 import yaml import os from TestPOM.common import dir_config as Dir import jsonpathclass Data:def __init__(self,keyNone,file_name"test_datas.yaml"):file_path os…...

ARMV8 RK3399 u-boot TPL启动流程分析 --start.S

上电后运行的第一支文件&#xff1a;arch/arm/cpu/armv8/start.S CONFIG_ENABLE_ARM_SOC_BOOT0_HOOK1 #include <asm/arch/boot0.h> 跳转到 arch/arm/include/asm/arch-rockchip/boot0.h CONFIG_SPL_BUILD1 b 1f ROCKCHIP_EARLYRETURN_TO_BROMno TINY_FRAMEWORKno …...