【SpringMVC】SpringMVC 请求与响应全解析:从 Cookie/Session 到状态码、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有两种方式

java 复制代码
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

java 复制代码
@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 提供的方法来进行设置

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

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


相关推荐
Elias不吃糖3 小时前
C++ 中的浅拷贝与深拷贝:概念、规则、示例与最佳实践(笔记)
开发语言·c++·浅拷贝·深拷贝
LEEBELOVED3 小时前
R语言高效数据处理-3个自定义函数笔记
开发语言·笔记·r语言
2501_938782093 小时前
从实例到单例:Objective-C 单例类的线程安全实现方案
开发语言·macos·objective-c
浪裡遊3 小时前
css面试题1
开发语言·前端·javascript·css·vue.js·node.js
喜欢吃燃面3 小时前
C++:红黑树
开发语言·c++·学习
佳哥的技术分享3 小时前
kotlin基于MVVM架构构建项目
android·开发语言·kotlin
杜子不疼.3 小时前
仓颉语言构造函数深度实践指南
java·服务器·前端
风一样的美狼子3 小时前
仓颉语言 LinkedList 链表实现深度解析
java·服务器·前端