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

news2024/9/21 10:50:03

一、接受文件

在 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.coloradmin.cn/o/2152120.html

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

相关文章

法定退休年龄计算器,看看你还有多少年退休?

最近延迟退休上了微博热搜&#xff0c;从2025年开始实行。 分享个法定退休年龄计算器&#xff0c;看看你还有多少年退休&#xff1f; 官方出品的计算器&#xff0c;网站地址 https://si.12333.gov.cn/304647.jhtml 输入出生日期和性别就可以。 当然也可以在微信的城市服务。…

基于asp.net固定资产管理系统设计与实现

博主介绍&#xff1a;专注于Java vue .net php phython 小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设&#xff0c;从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不然下次找不到哟 我的博客空间发布了1000毕设题目 方便大家学习使用 感兴趣的…

JZ2440开发板——S3C2440的UART

以下内容源于韦东山课程的学习与整理&#xff0c;如有侵权请告知删除。 一、UART硬件简介 UART&#xff0c;全称是“Universal Asynchronous Receiver Transmitter”&#xff0c;即“通用异步收发器”&#xff0c;也就是我们日常说的“串口”。 它在嵌入式中用途非常广泛&…

【计算机网络篇】物理层

本文主要介绍计算机网络第二章节的物理层&#xff0c;文中的内容是我认为的重点内容&#xff0c;并非所有。参考的教材是谢希仁老师编著的《计算机网络》第8版。跟学视频课为河南科技大学郑瑞娟老师所讲计网。 文章目录 &#x1f3af;一.基本概念及公式 &#x1f383;基本概念…

力扣-1035不相交的线(Java详细题解)

题目链接&#xff1a;力扣-1035不相交的线 前情提要&#xff1a; 因为本人最近都来刷dp类的题目所以该题就默认用dp方法来做。 dp五部曲。 1.确定dp数组和i下标的含义。 2.确定递推公式。 3.dp初始化。 4.确定dp的遍历顺序。 5.如果没有ac打印dp数组 利于debug。 每一…

安全基础学习-AES128加密算法

前言 AES&#xff08;Advanced Encryption Standard&#xff09;是对称加密算法的一个标准&#xff0c;主要用于保护电子数据的安全。AES 支持128、192、和256位密钥长度&#xff0c;其中AES-128是最常用的一种&#xff0c;它使用128位&#xff08;16字节&#xff09;的密钥进…

充电宝什么品牌比较好?五大性价比高充电宝品牌推荐!

在这个电子设备无处不在的时代&#xff0c;充电宝已成为我们生活中不可或缺的重要配件。无论是通勤、旅行还是户外休闲&#xff0c;充电宝都能为我们的手机、平板等提供及时的电量补充&#xff0c;确保我们时刻保持在线。一个安全可靠的充电宝&#xff0c;不仅能为我们的设备提…

GRU(门控循环单元)的原理与代码实现

1.GRU的原理 1.1重置门和更新门 1.2候选隐藏状态 1.3隐状态 2. GRU的代码实现 #导包 import torch from torch import nn import dltools#加载数据 batch_size, num_steps 32, 35 train_iter, vocab dltools.load_data_time_machine(batch_size, num_steps)#封装函数&…

VScode开发GD32移植(标准库通用),保姆级!!!!!!!

VScode开发GD32移植(标准库通用)&#xff0c;保姆级&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 文章目录 VScode开发GD32移植(标准库通用)&#xff0c;保姆级&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#…

[产品管理-30]:NPDP新产品开发 - 29 - 产品生命周期管理 - 可持续产品创新

目录 一、可持续开发与可持续创新 可持续开发 可持续创新 可持续开发与可持续创新的关系 二、循环经济 1、循环经济的定义 2、循环经济的起源与发展 3、循环经济的原则 4、循环经济的实践案例 5、循环经济的意义与展望 三、三重底线 1. 财务底线 - 企业。赚钱 2. …

11. DPO 微调示例:根据人类偏好优化LLM大语言模型

在部署大模型之后&#xff0c;我们必然要和微调打交道。现在大模型的微调有非常多的方法&#xff0c;过去的文章中提到的微调方法通常依赖于问题和答案对&#xff0c;标注成本较高。 2023 年所提出的 Direct Preference Optimization&#xff08;DPO&#xff09;为我们提供了一…

卡牌抽卡机小程序:市场发展下的创新

今年以来&#xff0c;卡牌成为了行业中的黑马&#xff0c;在国内迅速流行&#xff0c;成为消费者的心头好。小小的卡牌创下了百亿的市场规模&#xff0c;发展前景巨大&#xff01; 不过&#xff0c;随着卡牌市场的不断增长&#xff0c;市场发展也需要进行创新。线上抽卡机小程…

Yocto - 使用Yocto开发嵌入式Linux系统_02 认识 Yocto 项目

Meeting the Yocto Project 本章向你介绍 Yocto 项目。这里讨论的项目主要概念将贯穿全书。此外&#xff0c;我们还将简要讨论 Yocto 项目的历史、OpenEmbedded、Poky、BitBake、元数据和版本模式。系好安全带&#xff0c;欢迎加入我们的行列&#xff01; This chapter introdu…

信息安全数学基础(19)同余式的基本概念及一次同余式

一、同余式概念 同余式是数论中的一个基本概念&#xff0c;用于描述两个数在除以某个数时所得的余数相同的情况。具体地&#xff0c;设m是一个正整数&#xff0c;a和b是两个整数&#xff0c;如果a和b除以m的余数相同&#xff0c;则称a和b模m同余&#xff0c;记作a≡b(mod m)。反…

C语言 | Leetcode C语言题解之第421题数组中两个数的最大异或值

题目&#xff1a; 题解&#xff1a; const int HIGH_BIT 30;struct Trie {// 左子树指向表示 0 的子节点struct Trie* left;// 右子树指向表示 1 的子节点struct Trie* right; };struct Trie* createTrie() {struct Trie* ret malloc(sizeof(struct Trie));ret->left re…

SpringBoot 数据库表结构文档生成

官方地址&#xff1a;https://github.com/pingfangushi/screw screw 螺丝钉&#xff0c;支持以下数据库 MySQL MariaDB TIDB Oracle SqlServer PostgreSQL Cache DB&#xff08;2016&#xff09; 生产文档支持 html word markdown 开始 添加依赖 <!-- 螺丝钉 --><…

CompletableFuture-详解使用及源码解析

背景 上一篇文章我们看了FutureTask&#xff0c;分析了他的问题&#xff0c;异步编程并不方便。 问题1&#xff1a; FutureTask获取执行结果前&#xff0c;主线程需要通过get()方法一直阻塞等待子线程执行完成call方法&#xff0c;才可以拿到返回结果问题2&#xff1a;如果不…

电竞显示器哪个牌子好

电竞显示器哪个好&#xff1f;你想成为电竞选手吗&#xff1f;显示器很关键&#xff0c;下面我就列举7款市面流行的电竞显示器给大家看看&#xff0c;总有一款适合你。 1.电竞显示器哪个好 - 蚂蚁电竞 ANT255VF电竞显示器 一、产品概述 蚂蚁电竞 ANT255VF电竞显示器是一款专为…

2024/9/21 leetcode 21.合并两个有序链表 2.两数相加

目录 21.合并两个有序链表 题目描述 题目链接 解题思路与代码 2.两数相加 题目描述 题目链接 解题思路与代码 --------------------------------------------------------------------------- 21.合并两个有序链表 题目描述 将两个升序链表合并为一个新的 升序 链表并返…

ChatCADChatCAD+:Towards a Universal and Reliable Interactive CAD using LLMs

ChatCAD&#xff08;论文链接&#xff1a;[2302.07257] ChatCAD: Interactive Computer-Aided Diagnosis on Medical Image using Large Language Models (arxiv.org)&#xff09; 网络流程图&#xff1a; 辅助阅读&#xff1a; 基于大型语言模型的医学图像交互式计算机辅助诊…