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

一、接受文件

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

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:

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:

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 头信息,可以这样做:

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 属性来标记一个头信息为可选,这样即使没有提供这个头信息,应用也不会报错:

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.xdnf.cn/news/1541048.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【深入理解SpringCloud微服务】了解微服务的熔断、限流、降级,手写实现一个微服务熔断限流器

【深入理解SpringCloud微服务】了解微服务的熔断、限流、降级&#xff0c;手写实现一个微服务熔断限流器 服务雪崩熔断、限流、降级熔断降级限流 手写实现一个微服务熔断限流器架构设计代码实现整体逻辑ProtectorAspect#aroundMethod(ProceedingJoinPoint)具体实现1、获取接口对…

【Linux 】开发利器:深度探索 Vim 编辑器的无限可能

&#x1f525; 个人主页&#xff1a;大耳朵土土垚 &#x1f525; 所属专栏&#xff1a;Linux系统编程 这里将会不定期更新有关Linux的内容&#xff0c;欢迎大家点赞&#xff0c;收藏&#xff0c;评论&#x1f973;&#x1f973;&#x1f389;&#x1f389;&#x1f389; 文章目…

CANopen从站为什么总不上传PDO报文?

在CANopen网络中无法获取从站的TPDO数据&#xff1f;本文将为您解析可能的原因及解决方案。通过检查TPDO的通信参数和传输类型&#xff0c;确保主站与从站的数据同步&#xff0c;快速定位问题所在。 如果你的CANopen网络中已经确保接线和波特率都没有问题&#xff0c;但无论主站…

数学建模 第一讲 - 概论

一、什么是数学模型 一个栗子 例 1.1 一只装满水的圆柱型桶&#xff0c;底半径为 1米&#xff0c;高为 2米&#xff0c;底部有一直径为 0.1 米的洞。问桶流空要多少时间? 数学模型是对于一个特定的对象为了一个特定目标&#xff0c;根据事物的内在规律&#xff0c;作出一些必…

vs2022快捷键异常不起作用解决办法

安装了新版本的vs2022&#xff0c;安装成功后&#xff0c;发现快捷键发生异常&#xff0c;之前常用的快捷键要么发生改变&#xff0c;要么无法使用&#xff0c;比如原来注释代码的快捷键是ctrlec&#xff0c;最新安装版本变成了ctrlkc&#xff0c;以前编译代码的快捷键是F6或者…

搜索引擎onesearch3实现解释和升级到Elasticsearch v8系列(一)-概述

简介 此前的专栏介绍Onesearch1.0和2.0&#xff0c;详情参考4 参考资料&#xff0c;本文解释onesearch 3.0&#xff0c;从Elasticsearch6升级到Elasticsearch8代码实现 &#xff0c;Elasticsearch8 废弃了high rest client&#xff0c;使用新的ElasticsearchClient&#xff0c;…

Java | Leetcode Java题解之第420题强密码检验器

题目&#xff1a; 题解&#xff1a; class Solution {public int strongPasswordChecker(String password) {int n password.length();int hasLower 0, hasUpper 0, hasDigit 0;for (int i 0; i < n; i) {char ch password.charAt(i);if (Character.isLowerCase(ch))…

BUUCTF-MISC-另外一个世界

下载题目文件解压获得一张jpg格式图片 按照经验&#xff0c;排查了文件中是否隐写了flag字段等&#xff0c;并未发现线索 但是把十六进制打开的文件翻到文章底部可以发现一段二进制数字 这段数字正好为56位&#xff0c;八位二进制可以转换成一位ASKII码&#xff0c;这里我怀疑他…

【devops】devops-ansible之介绍和基础使用

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》&#xff1a;python零基础入门学习 《python运维脚本》&#xff1a; python运维脚本实践 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8…

SpringCloud构建工程

一、新建数据库和表&#xff0c;并填写测试数据 二、创建父级工程 1、创建maven工程 2、工程名字OfficeAutomation 3、pom.xml文件中添加依赖 <properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.encodin…

【PHP源码】匿名来信系统H5版本V1.0免费开源源码(含搭建教程)

你的匿名来信H5一封你的来信源码/表白祝福短信程序/往来信/传话短信源码支持邮件发信与手机短信发信“你的匿名来信”是最近某音上爆火的一个活动话题&#xff0c;可以通过H5网站&#xff0c;编辑自己想要对某人说的话或者祝福&#xff0c;网站会把您想说的发给您预留的号码&am…

Java 数据结构 最小栈的实现

在O&#xff08;N&#xff09;时间复杂度内找出最小值&#xff1a; 创建两个栈当普通栈只有一个数据时&#xff0c;把该数据放入最小栈往普通栈放入数据时&#xff0c;把要放入的数据和最小栈的栈顶数据相比较&#xff0c;若要放入的数据比最小栈的栈顶数据小&#xff0c;则把…

单元测试和unittest框架(超详细总结)

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;薪资嘎嘎涨 单元测试的定义 1. 什么是单元测试&#xff1f; 单元测试是指&#xff0c;对软件中的最小可测试单元在与程序其他部分相隔离的情况下进行检查和验证的工作&am…

上手一个RGBD深度相机:从原理到实践--ROS noetic+Astra S(中):RGB相机的标定和使用

前言 本教程涉及基础相机的原理&#xff0c;使用&#xff0c;标定&#xff0c;和读取。(注&#xff1a;本教程默认大家有ROS1基础&#xff0c;故不对程序进行详细解释) 上一期&#xff1a;[csdn博客]上手一个RGBD深度相机&#xff1a;从原理到实践–ROS noeticAstra S&#xf…

Python 低层多线程接口_thread的用法

_thread是python标准库中的一个低层多线程API&#xff0c;可以在进程中启动线程来处理任务&#xff0c;并且提供了简单的锁机制来控制共享资源的同步访问。本文就_thread模块的用法和特性做个简单的演示。 文章目录 一、进程和线程的区别二、_thread模块的用法2.1 派生线程2.2…

ElasticsearchRestTemplate DSL日志打印

ElasticsearchRestTemplate DSL日志打印 痛点解决方案打印基础文档查询信息打印最终DML语句 痛点 在使用 ElasticsearchRestTemplate 进行数据操作时&#xff0c;经常遇到的一个问题是线上问题排查困难。具体来说&#xff0c;在线上环境中&#xff0c;当出现问题时&#xff0c…

vue项目中——如何用echarts实现动态水球图

有时候UI的脑洞真的很大&#xff0c;总是设计出一些稀奇古怪的图形&#xff0c;但又不得不佩服他们的审美&#xff0c;确实还挺好看的。今天给大家介绍echarts如何实现动态水球图。如图所示&#xff1a; 实现步骤 一、引入 在vue页面中引入echarts&#xff0c;如未安装需要先…

Java面试篇基础部分-Synchronized关键字详解

Synchronized关键字用于对Java对象、方法、代码块等提供线程安全操作。Synchronized属于独占式的悲观锁机制,同时也是可重入锁。我们在使用Synchronized关键字的时候,可以保证同一时刻只有一个线程对该对象进行访问;也就是说它在同一个JVM中是线程安全的。   Java中的每个…

Golang | Leetcode Golang题解之第420题强密码检验器

题目&#xff1a; 题解&#xff1a; func strongPasswordChecker(password string) int {hasLower, hasUpper, hasDigit : 0, 0, 0for _, ch : range password {if unicode.IsLower(ch) {hasLower 1} else if unicode.IsUpper(ch) {hasUpper 1} else if unicode.IsDigit(ch)…

TLC/TK Adv学习笔记1 - Py版本+美化

Python下重点 tkinter.ttk 模块自 Tk 8.5 开始引入&#xff0c;它提供了对 Tk 风格的部件集的访问。 它还带来了一些额外好处包括在 X11 下的反锯齿字体渲染和透明化窗口&#xff08;需要有 X11 上的混合窗口管理器&#xff09;。 tkinter.ttk 的基本设计思路&#xff0c;就是…