Spring Mvc(二)

一.获取Cookie,Session,Header

在处理http请求时,先明白http协议是"无状态"的(指服务器默认不会保留客户端请求之间的任何信息。)会导致用户登录状态、购物车内容等连续性功能无法直接实现。解决该问题据需要用到Cookie和Session,接下来进行解释:

1.Cookie 和 Session 基本概念

1.1 什么是 Cookie?

Cookie​ 是服务器发送到用户浏览器并保存在本地的一小块数据(最大 4KB),浏览器会在后续请求中自动携带它。

用一个登录请求说明:

因为http协议是无状态的,服务器通过给客户端发送一个令牌,下次客户端请求时带上令牌,服务器通过令牌就能够识别客户端,这个令牌就是Cookie

1.2 什么是 Session?

Session​ 是服务器端存储的用户会话数据,通常用 Session ID 标识,Session ID 通过 Cookie 在客户端存储。

Session 的核心机制就是服务器为每个独立的客户端在服务器端创建并维护一个专属的、隔离的数据存储空间,以解决 HTTP 协议无状态的问题。

  • 服务器创建 Session
    • 对于首次访问新会话的客户端(如图中的 A、B、C),服务器会在其内存或专用数据库中创建一个新的、唯一的 Session 对象

    • 这个 Session 对象就像服务器端的一个“私人档案袋”,用于存放该用户在这次会话中的状态信息(如用户 ID、登录状态、购物车商品等)。

  • 关联客户端与 Session

    • 服务器在创建 Session 的同时,会生成一个唯一的标识符,即Session ID

    • 服务器在响应中,会通过Set-Cookie​ 头部将这个 Session ID 发送给客户端。

    • 客户端(浏览器)会保存这个 Cookie(包含 Session ID)。

  • 后续请求的身份识别

    • 此后,该客户端发出的每一个 HTTP 请求,浏览器都会自动在请求头(Cookie 头部)中带上这个 Session ID

    • 服务器收到请求后,通过解析请求中的 Session ID,就能快速找到之前在服务器端为该客户端创建的专属 Session 对象,从而“认出”用户,并读取或修改其中的状态信息。

1.3 Cookie和Session的区别

  • 两者都保存用户信息,但是Cookie客户端保存信息的机制,Session服务端保存信息的机制
  • 两者主要通过SessionID关联起来的
  • 两者经常一起搭配使用,但不是必须的
  • SessionId不一定非得靠Set-Cookie传输,也可以通过url传输
  • 可以用Cookie来保存数据在客户端

1.4获取cookie

(1)传统获取
@RestController @RequestMapping("/request") public class RequestControl { @RequestMapping("/getCookie") public String getCookie(HttpServletRequest request, HttpServletResponse response){ //HttpServletRequest request, HttpServletResponse response //http请求内容,http响应内容 //两者为内置对象,不需要额外创建 Cookie[] cookies = request.getCookies(); if(cookies != null){ for(Cookie cookie : cookies){ System.out.println(cookie.getName()+":"+cookie.getValue()); } } return "获取成功"; } }

浏览器输入网址127.0.0.1:8080/request/getCookie得到结果:

除此之外,cookie中不一定存储用户信息,并且可以伪造:

在浏览器中使用F12,向cookie传送bite:666

在代码运行结果中发现得到了cookie

(2)简洁获取
@RequestMapping("/getCookie2") public String getCookie2(@CookieValue String cookieValue){ return "获取成功 "+cookieValue; }

1.5获取session

(1)存储和获取

存储

//存储Session @RequestMapping("/setSession") public String setSession(HttpServletRequest request, HttpServletResponse response){ //获取session对象 HttpSession session=request.getSession(); //getSession()方法参数为True=>未获取到Session对象,则创建一个 // false=>为获取到Session对象,返回null //无参默认为true session.setAttribute("name","zhangsan"); session.setAttribute("age",30); session.setAttribute("user",new Person("lisi",20,"男")); return "设置Session成功"; }

获取

//获取Session @RequestMapping("/getSession") public String getSession(HttpServletRequest request, HttpServletResponse response){ //获取session对象 HttpSession session=request.getSession(); System.out.println("name"+session.getAttribute("name")); System.out.println("age"+session.getAttribute("age")); System.out.println("user"+session.getAttribute("user")); return "获取Session成功"; }

结果展示

(2)简洁获取1
@RequestMapping("/getSession2") public String getSession2(@SessionAttribute String name){ //获取session对象 return "获取Session成功 name:"+name; }
(3)简洁获取2
@RequestMapping("/getSession3") public String getSession3(HttpSession session){ //获取session对象 return "获取Session成功 name:"+session.getAttribute("name"); }

2.获取Header

(1)传统获取

@RequestMapping("/getHeader") public String getHeader(HttpServletRequest request){ String header = request.getHeader("User-Agent"); return "User-Agent: "+header; }

(2)简洁获取

@RequestMapping("/getHeader2") public String getHeader2(@RequestHeader("User-Agent") String header){ return "User-Agent: "+header; }

二.响应

1.返回静态页面

@Control=>返回视图

@RestControl=>返回数据

@Controller @RequestMapping("/response") public class ResponseControl { @RequestMapping("/returnHtml") public String returnHtml(){ return "/index.html"; } }
//index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> 我是欢迎页 </body> </html>

使用@RestControl=>返回字符串"/index.html"

@RestController @RequestMapping("/response") public class ResponseControl { @RequestMapping("/returnHtml") public String returnHtml(){ return "/index.html"; } }

2.返回数据@ResponseBody

将数据写入http响应体中

加在类上=>所有方法返回数据

加在方法上=>该方法返回数据

@Controller @RequestMapping("/response") public class ResponseControl { @ResponseBody @RequestMapping("/returnHtml") public String returnHtml(){ return "/index.html"; } }

3.返回HTML代码片段

@ResponseBody @RequestMapping("/returnHtmlCode") public String returnHtmlCode(){ return "<h1>一级标题<h1>"; }

4.返回JSON

spring自动将对象转化为json

//返回json @ResponseBody @RequestMapping("/returnJson") public Person returnJson(){ return new Person("zhangsan",2,"nan"); }

5.设置状态码

Spring Mvc会根据返回结果自动设置响应状态码,可通过HttpServletResponse提供的方法手动设置

@RestController @RequestMapping("/response") public class ResponseControl { @RequestMapping("/custom") public String customStatus(HttpServletResponse response) { // 设置自定义状态码 response.setStatus(418); // I'm a teapot return "我是一个茶壶"; } @RequestMapping("/redirect") public void redirect(HttpServletResponse response) throws IOException { // 302 重定向 response.sendRedirect("/response/success"); } }

6.设置Header

通过produces修改Content-Type

@ResponseBody @RequestMapping(value = "/contentType",produces = "application/json") public String contentType(){ return "{\"success\":true}" ; }

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

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

相关文章

Window逆向基础之逆向工程介绍

逆向工程 以设计方法学为指导&#xff0c;以现代设计理论、方法、技术为基础&#xff0c;运用各种专业人员的工程设计经验、知识和创新思维&#xff0c;对已有产品进行解剖、深化和再创造。 逆向工程不仅仅在计算机行业、各行各业都存在逆向工程。 计算机行业逆向工程 计算…

逆向工程工具集

目录 helloHex Editor &#xff08;16进制编辑器&#xff09; [Reverse Engineers Hex Editor](https://bbs.pediy.com/thread-263443.htm)[wxMEdit](https://bbs.pediy.com/thread-263443.htm#wxmedit)[wxHexEditor](https://bbs.pediy.com/thread-263443.htm#wxhexed…

网络安全的基本概念(小白入门-附资料)

一、什么是网络安全 &#xff08;1&#xff09;网络安全 网络安全指网络系统中的硬件、软件以及系统中的数据受到保护&#xff0c;不因偶然或恶意的原因而遭到破坏、更改、泄露&#xff0c;系统连续可靠正常地运行&#xff0c;网络服务不中断。 网络安全包括&#xff1a;网络…

2026上海雅思培训深度测评TOP5:权威榜单+提分实测,选课不踩坑

据英国文化教育协会权威数据,上海雅思考生年均增长18%,其中徐汇区、杨浦区、浦东新区、闵行区、黄浦区等多区县考生,备考中普遍面临雅思培训选课繁琐、优质教育机构难筛选的困境,多数考生苦于考试提分技巧不足、个…

Excel字符编码完全指南:LEN、LENB、WIDECHAR、ASC函数深度解析

在处理文本数据时&#xff0c;你是否曾困惑于中英文混合字符的长度计算&#xff1f;本文将揭开Excel字符编码的神秘面纱&#xff0c;带你彻底理解字符与字节的区别。 一、计算机字符编码基础&#xff1a;从位到字符 1. 存储单位&#xff1a;从比特到字节 基础单位定义 比特&…

2026上海雅思培训权威测评TOP5:高性价比选课指南,精准提分不踩坑

经全国雅思教学质量监测中心联合雅思备考研究院发起,结合上海徐汇、浦东、静安、闵行、杨浦五大核心区县15000份考生调研及实测,本次开展上海雅思培训深度测评,精准破解本地考生在雅思培训、选课、考试中的核心难题…

上海雅思考试提分攻略|5家优质机构深度测评,靠谱选择不踩坑

作为国内雅思考试核心考区,上海汇聚了徐汇区、浦东新区、杨浦区、闵行区、黄浦区等众多备考人群,高校在读学生、在职人士、留学规划党均深陷雅思培训选课困境。据权威测评显示,上海雅思考生核心痛点突出:选课难,难…

CF917E 做题记录

让我深感畏惧的题目。link 考虑将答案分为两条链上的,以及跨越 lca 的。 对于两条链上的,对所有串正反串一起建 AC 自动机,树上每个点求出从根到该点的匹配状态,在 AC 自动机上对应一个结点。 对于每个询问,相当于…

2026雅思网课权威实用深度测评排行榜 高分提分方案全解析

在雅思培训赛道中,选课难题始终困扰着广大考生,既要兼顾考试提分效率与优质技巧传授,又要权衡教育机构的口碑排名、性价比与个性化服务,靠谱实用的备考方案难寻。基于3个月行业调研、2000+真实学员反馈及多维度权威…

2026雅思网课口碑排名TOP5 深度权威测评优质提分靠谱机构

结合2026年雅思考试趋势及行业调研数据,雅思备考群体普遍面临诸多痛点:优质教育机构鱼龙混杂难以甄别,选课决策缺乏权威参考依据,提分技巧掌握不系统导致备考效率低下,个性化需求难以被满足,高性价比与提分效果难…

2026安徽中专择校指南:五强解析与趋势前瞻

在职业教育改革持续深化、技能型社会加速构建的今天,安徽省的中等职业教育正站在一个全新的历史拐点。对于广大初中毕业生及家庭而言,选择一所合适的中专、技工学校,已远非一次简单的升学决策,而是关乎孩子未来职业…

全国雅思培训机构深度测评TOP5:权威榜单助你高效选课提分

雅思考试是全球认可的语言能力测试,更是中国学子留学深造的必经之路,选择优质靠谱的雅思培训机构、掌握科学提分技巧,是实现高分目标的关键。当前雅思培训市场鱼龙混杂,无论是北京朝阳区、上海静安区、广州天河区,…

2026雅思网课提分口碑排名榜:权威深度测评及靠谱提分方案

基于2026年雅思考情迭代与全国3000+考生调研数据,雅思备考的核心痛点愈发凸显:多数考生在培训选课中陷入迷茫,既渴求优质教育机构提供权威提分技巧,又纠结性价比与个性化方案适配性,面对繁杂的考试考点难以找到实…

2026 雅思网课深度测评排行榜 AI赋能实用靠谱提分机构推荐

据British Council官方数据显示,2025年中国大陆考生雅思平均分为5.8分,口语单项仅5.4分,高分突破难度持续攀升。在雅思培训选课过程中,考生常面临优质资源稀缺、提分技巧杂乱、性价比失衡等问题,如何从众多教育机…

谁是雅思培训天花板?5家机构全面测评,性价比与提分效果双优选

近年来,雅思考试热度持续攀升,考生渴望通过优质雅思培训实现高分突破、衔接留学,但雅思培训选课难、提分慢、机构鱼龙混杂等问题,困扰着全国各区县(北京朝阳、上海浦东、广州天河、深圳南山、成都锦江等)雅思考生…

【课程设计/毕业设计】基于springboot的实验幼儿园信息管理系统基于springboot的幼儿园管理系统【附源码、数据库、万字文档】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

2026年网络安全该怎么学?从0到精英网安高效学习方法看这一篇就够了!

2026年&#xff0c;网络安全行业迎来结构性变革&#xff1a;新修订的《网络安全法》将人工智能安全正式纳入法律体系&#xff0c;AI驱动的攻防对抗成为主流&#xff0c;平台化防御取代传统工具堆砌模式&#xff0c;数据投毒、AI身份伪造等新型威胁频发。与此同时&#xff0c;全…

一文搞懂二叉树

一文搞懂二叉树 二叉树是计算机科学中最基础的树形数据结构&#xff0c;也是面试、算法开发、工程应用&#xff08;如表达式解析、搜索索引&#xff09;的核心考点。本文从 概念→分类→存储→遍历→操作→应用 层层递进&#xff0c;结合 C 代码示例&#xff0c;让你彻底吃透二…

JavaScript数组(Array对象)应用介绍

.一、Array数组基础 在JavaScript中,数组没有原始类型,可以使用Array对象,Array对象具有以下特征: 1)可调整大小的,并且可以包含不同的数据类型。 2)不是关联数组,因此,不能使用任意字符串作为索引访问数组元…

一文搞懂C++容器篇

一文搞懂C之容器篇 C STL&#xff08;标准模板库&#xff09;的核心价值之一就是提供了丰富的容器——即“存储数据的通用结构”&#xff0c;能帮我们快速实现数据的存储、访问、插入、删除等操作&#xff0c;无需重复造轮子。本文将C常用容器按“功能分类”梳理&#xff0c;从…