Spring MVC 基础 : 文件、cookies的接收 ,REST响应

embedded/2024/10/20 17:35:08/

一、接受文件

在 Spring MVC 中,可以使用 @RequestPart 注解来接收文件。这个注解常用于处理复杂的请求,如同时发送 JSON 数据和文件。@RequestPart 非常适用于多部分请求(multipart requests),这在单个请求中同时发送文件和数据。

java">import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;@RestController
public class FileUploadController {@PostMapping("/upload")public String handleFileUpload(@RequestPart("file") MultipartFile file,@RequestPart("metadata") Metadata metadata) {try {// 处理文件,例如保存到服务器file.transferTo(new File("/path/to/destination/" + file.getOriginalFilename()));// 还可以处理元数据System.out.println("Image description: " + metadata.getDescription());return "File uploaded successfully: " + file.getOriginalFilename();} catch (Exception e) {return "Error during file upload: " + e.getMessage();}}static class Metadata {private String description;public String getDescription() {return description;}public void setDescription(String description) {this.description = description;}}
}
HTML 表单

在前端,您可以创建一个表单来发送文件和 JSON 数据。

<form method="POST" action="/upload" enctype="multipart/form-data"><input type="file" name="file"><input type="hidden" name="metadata" value='{"description":"A sample image"}'><button type="submit">Upload</button>
</form>
  • 确保表单的 enctype 设置为 multipart/form-data
  • 使用 @RequestPart 时,Spring 需要能够解析和构造请求中的多部分数据,这通常是通过配置 MultipartResolver 实现的。在 Spring Boot 中,这通常会自动配置。
  • 检查安全性问题,尤其是处理文件类型和内容时。

二、Cookies 与 Session 

CookiesSession 是用于存储信息、跟踪用户状态和进行用户身份验证的两个非常重要的概念.

Cookies

Cookies 是小的数据片段,由服务器发送到用户的浏览器,并由浏览器存储。每当同一用户回到该服务器时,浏览器会将这些数据片段发送回服务器。Cookies 常用于保存用户偏好、购物车内容、身份验证令牌等。

特点

  • 客户端存储:Cookies 存储在用户的浏览器上。
  • 大小限制:每个 Cookie 的大小限制约为 4KB,并且每个域的 Cookie 数量也有限制。
  • 安全性:Cookies 可以通过设置为 HttpOnlySecure 来增强安全性。HttpOnly 防止客户端脚本访问 Cookie,Secure 标记确保 Cookie 仅通过 HTTPS 发送。
  • 持久性:Cookies 可以设置过期时间,即使浏览器关闭后依然存在,直至到达设定的过期时间。

Session

Session 是另一种在服务器上跟踪用户状态的方法。服务器为每个用户创建一个 Session 对象,通常保存在服务器的内存中。每个 Session 都有一个唯一的标识符(通常称为 Session ID),这个标识符会被存储在 Cookie 中(也可通过 URL 重写等方式传递),以便在后续请求中识别用户。

特点

  • 服务器端存储:Session 数据存储在服务器上,通常在内存中,也可以持久化到数据库或文件系统。
  • 安全性:由于 Session 数据不在客户端展示,它比 Cookie 更安全。
  • 可存储大量数据:相比于 Cookies,Session 可以存储更多的数据,因为数据存储在服务器上。
  • 依赖于 Cookie:尽管 Session 本身存储在服务器上,但 Session ID 通常通过 Cookie 传输,这意味着如果用户禁用了 Cookie,Session 功能可能会受到影响。

三、Spring MVC 与 Cookie 

1)获取 Cookie

使用 @CookieValue 注解,可以直接在控制器的方法参数中捕获 Cookie 值。例如,如果想获取名为 sessionId 的 Cookie:

java">import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class CookieController {@GetMapping("/get-cookie")public String readCookie(@CookieValue(name = "sessionId", defaultValue = "No Session") String sessionId) {return "Session ID: " + sessionId;}
}

在这个例子中,@CookieValue 注解用来指定我们想获取的 Cookie 名称。你也可以设置 defaultValue,这样如果指定的 Cookie 不存在,就会使用这个默认值

2) 设置 Cookie

要在 Spring MVC 中设置 Cookie,需要创建一个 Cookie 对象,并通过 HttpServletResponse 添加到响应中。这里是一个示例方法,展示如何创建和发送一个新的 Cookie:

java">import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class CookieController {@GetMapping("/set-cookie")public String setCookie(HttpServletResponse response) {Cookie cookie = new Cookie("sessionId", "123456789");cookie.setMaxAge(7 * 24 * 60 * 60); // 设置 Cookie 有效期为一周cookie.setHttpOnly(true); // 增强安全性,防止客户端脚本访问cookie.setPath("/"); // 设置 Cookie 适用的路径response.addCookie(cookie);return "Cookie set";}
}

四、获取header 

使用 @RequestHeader 注解轻松地从 HTTP 请求中提取 HTTP 头信息。这个注解可以绑定方法参数到特定的请求头,从而可以在控制器中直接使用这些头信息。可以通过将 @RequestHeader 添加到控制器方法的参数上来获取指定的请求头值。例如,如果你想获取请求中的 User-AgentAccept-Language 头信息,可以这样做:

java">import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RestController;@RestController
public class HeaderController {@GetMapping("/get-headers")public String getHeaders(@RequestHeader("User-Agent") String userAgent,@RequestHeader("Accept-Language") String language) {return "User-Agent: " + userAgent + "\nAccept-Language: " + language;}
}

可选头信息

并非所有头信息在每个请求中都是必需的。你可以使用 required=false 属性来标记一个头信息为可选,这样即使没有提供这个头信息,应用也不会报错:

java">import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RestController;@RestController
public class HeaderController {@GetMapping("/optional-header")public String getOptionalHeader(@RequestHeader(value = "X-Optional-Header", required = false) String optionalHeader) {return optionalHeader != null ? "Optional Header: " + optionalHeader : "No Optional Header Provided";}
}


http://www.ppmy.cn/embedded/118250.html

相关文章

C++密码安全检测

目标 关键代码 int getScore(string s) {int score 0;for (int i 0; i < s.size(); i) {char currentLetter s[i];if (isdigit(currentLetter))score scoreOfNumber;else if (isalpha(currentLetter)) {int ascii currentLetter;if (ascii < 0x5A) // Upper-casesc…

MySQL(七)——事务

文章目录 事务事务的概念事务的ACID特性事务的语法查看存储引擎查看自动提交参数和设置手动事务操作保存点 隔离级别与并发事务问题隔离级别并发事务问题 事务 事务的概念 事务&#xff08;Transaction&#xff09;是数据库管理系统中执行过程中的一个逻辑单位&#xff0c;由…

「OC」引用计数(一)

iOS学习 前言自动引用计数引用计数引用计数的思考方式自己生成的对象&#xff0c;自己持有非自己生成的对象&#xff0c;自己也能持有不再需要自己持有的对象时释放无法释放非自己持有的对象 总结 前言 在学习oc时对引用计数略有了解&#xff0c;现在进行系统的学习总结。 自动…

列式存储格式

列式存储格式有多种&#xff0c;以下是一些常见的列式存储格式&#xff1a; Apache Parquet&#xff1a;专为大数据处理而设计&#xff0c;支持高效的数据压缩和编码&#xff0c;适用于 Hadoop 生态系统。 Apache ORC (Optimized Row Columnar)&#xff1a;主要用于 Hive 以及…

分布式Redis(14)哈希槽

文章目录 一致性哈希算法理论普通哈希的问题一致性hash算法 Redis 使用哈希槽Redis Cluster集群 为什么Redis是使用哈希槽而不是一致性哈希呢&#xff1f;为什么Redis Cluster哈希槽数量是16384&#xff1f; 关键词&#xff1a;一致性 Hash&#xff0c;哈希槽&#xff0c; 带着…

PHP Swoole 基本使用

背景 在项目中&#xff0c;我们使用了PHP语言&#xff0c;但由于存在长耗时的任务&#xff0c;所以需要服务器端异步响应。为了实现异步响应&#xff0c;我们有多种方案可选&#xff0c;包括MQ&#xff08;消息队列&#xff09;、fsocket&#xff08;文件套接字&#xff09;、…

代码随想录算法训练营DAY09之动态规划(一)基础题目

理论基础&#xff1a; 如果某一问题有很多重叠子问题&#xff0c;使用动态规划是最有效的。 动态规划中每一个状态一定是由上一个状态推导出来的&#xff0c;这一点就区分于贪心&#xff0c;贪心没有状态推导&#xff0c;而是从局部直接选最优的。 例子&#xff1a; 例如&a…

Electron-vue asar 局部打包优化处理方案——绕开每次npm run build 超级慢的打包问题

背景 因为组员对于 Electron 打包过程存在比较迷糊的状态&#xff0c;且自己也没主动探索 Electron-vue 打包细节&#xff0c;导致每次打包过程都消耗 5-6 分钟的时间&#xff0c;在需要测试生产打包时&#xff0c;极其浪费时间&#xff0c;为此针对 Electron-vue 打包的几个环…