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

【SpringMVC】SpringMVC 请求与响应全解析:从 Cookie/Session 到状态码、Header 配置

文章目录

  • SpringMVC
    • 2.请求
      • 12).获取Cookie/Session
        • 获取Cookie
        • 获取Session
      • 13).获取Header
    • 3.响应
      • 1). 返回静态页面
      • 2).返回数据@ResponseBody
      • 3).返回HTML代码片段
      • 4).返回JSON
      • 5).设置状态码
      • 6).设置Header(了解即可)
      • 7).设置Content-Type
      • 8).设置其他Header

SpringMVC

2.请求

12).获取Cookie/Session

  • 回顾 Cookie

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

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

在这里插入图片描述

  • 理解Session

我们先来了解一下什么是会话

会话:对话的意思

在这里插入图片描述
在计算机领域, 会话是一个客户与服务器之间的不中断的请求响应
对客户的每个请求,服务器能够识别出请求来自于同一个客户.当一个未知的客户向Web应用程序发送第一个请求时就开始了一个会话.当客户明确结束会话或服务器在一个时限内没有接受到客户的任何请求时,会话就结束了.

服务器同一时刻收到的请求是很多的.服务器需要清楚的区分每个请求是属于哪个用户,也就是属于哪个会话,就需要在服务器这边记录每个会话以及与用户的信息的对应关系.
Session是服务器为了保存用户信息而创建的一个特殊的对象.

在这里插入图片描述

Session的本质就是一个 “哈希表”,存储了一些键值对结构. Key 就是SessionID, Value 就是用户信息(用户信息可以根据需求灵活设计).

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

在这里插入图片描述

Session默认是保存在内存中的,如果重启服务器则Session数据就会丢失

在这里插入图片描述

  • Cookie 和 Session的区别
  • Cookie 是客户端保存用户信息的一种机制. Session 是服务器端保存用户信息的一种机制.
  • Cookie 和 Session之间主要是通过 SessionId 关联起来的, SessionId 是 Cookie 和 Session 之间的桥梁
  • Cookie 和 Session 经常会在一起配合使用. 但是不是必须配合.
    • 完全可以用 Cookie 来保存一些数据在客户端. 这些数据不一定是用户身份信息, 也不一定是 SessionId
    • Session 中的sessionId 也不需要非得通过 Cookie/Set-Cookie 传递, 比如通过URL传递.
获取Cookie

传统获取Cookie
在这里插入图片描述

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

在这里插入图片描述

通过这个例子,可以看出Cookie是可以伪造的,也就是不安全的,所以受用Cookie的时候,后端需要进行Cookie校验

简洁获取Cookie
在这里插入图片描述

获取Session

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

Session 存储
在这里插入图片描述

该代码中看不到SeesionId这样的概念. getSession 操作内部提取到请求中的Cookie 里的 SessionId, 然后根据SessionId获取到对应的Session 对象, Session 对象用HttpSession来描述
在这里插入图片描述

获取Session有两种方式

HttpSession getSession(boolean create);HttpSession getSession();

HttpSession getSession(boolean create):参数如果为 true,则当不存在会话时新建会话;参数如果为 false,则当不存在会话时返回 null

HttpSession getSession():和getSession(true) 含义一样,默认值为true.

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

Session读取
读取Session可以使用 HttpServletRequest
在这里插入图片描述

  • ①.先设置Session

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • ②.获取Session
    在这里插入图片描述
    在这里插入图片描述

简洁获取session两种方式
在这里插入图片描述

13).获取Header

传统获取 header
获取 Header 也是从 HttpServletRequest 中获取
在这里插入图片描述

简洁获取Header
在这里插入图片描述

3.响应

在我们前面的代码例子中,都已经设置了响应数据, Http响应结果可以是数据, 也可以是静态页面,也可以针对响应设置状态码, Header信息等.

1). 返回静态页面

创建前端页面 index.html(注意路径)
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

我们需要把 @RestController 改为 @Controller

正确代码如下:

在这里插入图片描述
随着互联网的发展,目前项目开发流行"前后端分离"模式, Java主要是用来做后端项目的开发,所以也就不再处理前端相关的内容了
MVC的概念也逐渐发生了变化,View不再返回视图,而是返回显示视图时需要的数据.

所以前面使用的 @RestController 其实是返回的数据.
@RestController = @Controller + @ResponseBody

在这里插入图片描述

2).返回数据@ResponseBody

我们上面谈到,@ResponseBody表示返回数据

在这里插入图片描述

@ResponseBody 既是类注解,又是方法注解
如果作用在类上,表示该类的所有方法,返回的都是数据,如果作用在方法上,表示该方法返回的是数据.

也就是说,如果类上有 @RestController 注解时: 表示所有的方法上添加了 @ResponseBody 注解,也就是当前类下所有的方法返回值做为响应数据

如果一个类的方法里,既有返回数据的,又有返回页面的,就把 @ResponseBody 注解添加到对应的方法上即可

3).返回HTML代码片段

后端返回数据时,如果数据中有HTML代码,也会被浏览器解析

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
响应中的 Content-Type 常见取值有以下几种:

  • text/html :body 数据格式是 HTML
  • text/css :body 数据格式是 CSS
  • application/javascript :body 数据格式是 JavaScript
  • application/json :body 数据格式是 JSON

如果请求的是js文件, Spring MVC会自动设置Content-Type为 application/javascript
如果请求的是css文件, Spring MVC会自动设置Content-Type为 text/css

4).返回JSON

SpringMVC 也可以返回JSON

后端方法返回结果为对象

在这里插入图片描述

在这里插入图片描述

5).设置状态码

Spring MVC会根据我们方法的返回结果自动设置响应状态码,程序员也可以手动指定状态码

通过Spring MVC的内置对象HttpServletResponse 提供的方法来进行设置

在这里插入图片描述

在这里插入图片描述

6).设置Header(了解即可)

Http响应报头也会向客户端传递一些附加信息,比如服务程序的名称,请求的资源已移动到新地址等,如:Content-Type, Local等.

这些信息通过 @RequestMapping 注解的属性来实现
先来看 @RequestMapping 的源码:

在这里插入图片描述

7).设置Content-Type

我们通过设置 produces属性的值,设置响应的报头Content-Type

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

在这里插入图片描述
在这里插入图片描述
如果不设置produces,方法返回结果为String时,Spring MVC默认返回类型,是text/html.

8).设置其他Header

设置其他Header的话,需要使用Spring MVC的内置对象HttpServletResponse 提供的方法来进行设置

@RequestMapping(value = "/setHeader")
@ResponseBody
public String setHeader(HttpServletResponse response) {response.setHeader("MyHeader","MyHeaderValue");return "设置Header成功";
}

void setHeader(String name, String value) 设置一个带有给定的名称和值的 header. 如果 name 已经存在,则覆盖旧的值.

在这里插入图片描述
在这里插入图片描述

http://www.dtcms.com/a/544959.html

相关文章:

  • 兰州网站建设ulezhi郑州网站建设培训短期班
  • 8.1.2 大数据方法论与实践指南-埋点实现方式分类
  • 7.1.5 大数据方法论与实践指南-日志系统+监控报警
  • Node.js Stream:深入理解与高效使用
  • 7.1.1 大数据方法论与实践指南-数仓元数据平台(数据地图)
  • 网站建设会计处理重庆网络公司产品设计
  • LeetCode 2001.可互换矩形的组数
  • 哈尔滨做网站哪家好电脑外设网站建设论文
  • 【Linux】数据链路层
  • 基于CentOS安装LNMP
  • Vue八股问题
  • 2025.10.21作业
  • SpringBoot面试题01-ApplicationContextInitializer
  • java之Future
  • Projection Error: Explanation and Causes 关于投影误差的解释与说明
  • php网站开发模板织梦移动端网站模板下载地址
  • 【JavaEE初阶】TCP的核心机制6——拥塞控制
  • LangChain4j学习一:聊天和语言模型
  • LeetCode hot100:056 合并区间:高效算法解析
  • uni-app开发入门手册
  • 做网站属于程序员吗网站搭建php源码
  • 什么是支架电容,它的原理是什么
  • 仓颉UI开发精髓:构建高复用、可组合的自定义组件
  • 校园文化宣传主题网站的建设做门户网站多少钱
  • 深入理解 Rust 的 Iterator Trait:惰性与抽象的力量
  • vs做网站怎么加文件夹商丘销售网站制作
  • 自定义ViewGroup实现要点
  • docker学习笔记,从入门开始!
  • 从 MVC 5 到 Core MVC:ASP.NET MVC 框架的 “进化之路“
  • 认识人工智能与大模型应用开发