Spring学习笔记_47——@RequestAttribute

Spring学习笔记_44——@ModelAttribute
Spring学习笔记_45——@ControllerAdvice
Spring学习笔记_46——@InitBinder

@RequestAttribute

文章目录

  • @RequestAttribute
      • 1. 介绍
      • 2. 场景
      • 3. 源码
      • 4. Demo
        • 4.1
        • 4.2
      • 5. 注意
      • 6. 补充

1. 介绍

@RequestAttribute注解用于将Web请求的属性注入到控制器方法的参数中。这些属性可能是在请求处理过程中的某个阶段,如过滤器或拦截器中设置的。通过该注解,开发者可以方便地访问这些请求属性,而无需手动从HttpServletRequest对象中获取。

2. 场景

不通过HttpServletRequestgetAttribute()方法从请求域中获取数据,从而实现与Servlet API进行解耦,就可以使用@RequestAttribute注解实现

@RequestAttribute注解通常用于以下场景:

  1. 表单提交:在处理表单提交时,可能需要访问由前端传递或在服务器端设置的请求属性。
  2. 文件上传:在文件上传场景中,可以结合其他注解(如@RequestParam)一起使用,以访问请求中的文件和其他属性。
  3. 自定义请求处理:在自定义请求处理逻辑中,可能需要访问请求属性来执行特定的业务逻辑。

3. 源码

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestAttribute {

    // String类型的属性,主要用于之情请求作用域中的属性名称
	@AliasFor("name")
    String value() default "";

    // String类型的属性,作用与value属性相同
    @AliasFor("value")
    String name() default "";
    
    // boolean类型的属性,表示请求作用域中的属性是否必需
    // true: 必需
    // false: 非必需
    // 如果为true,则当前请求域中没有对应的属性,就会抛出异常。
    // 默认值为true
    boolean required() default true;

}

4. Demo

4.1
// 在拦截器中对请求添加一个属性
public class LoginFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        // 假设我们已经验证了用户身份,并获取到了用户的ID
        String userId = "12345";
        httpRequest.setAttribute("userId", userId);
        chain.doFilter(request, response);
    }
}
// 在控制器中,通过@RequestAttribute注解访问拦截器中设定的属性
@Controller
public class UserController {

    @GetMapping("/user")
    public String getUser(@RequestAttribute("userId") String userId, Model model) {
        // 使用 userId 进行业务逻辑处理
        User user = userService.getUserById(userId);
        model.addAttribute("user", user);
        return "userProfile";
    }
}
4.2
// 从请求中获取名为 preferences 的属性,这是一个可能不存在的属性。
// 如果它不存在,我们将不会抛出异常,而是使用一个空的 HashMap 作为默认值
@Controller
public class PreferenceController {

    @GetMapping("/preferences")
    public String getPreferences(
            @RequestAttribute("userId") String userId,
            @RequestAttribute(value = "preferences", required = false) Map<String, String> preferences,
            Model model) {
        
        if (preferences != null) {
            model.addAttribute("preferences", preferences);
        } else {
            model.addAttribute("preferences", new HashMap<>());
        }

        return "userPreferences";
    }
}

5. 注意

属性来源@RequestAttribute注解访问的请求属性可能来自过滤器、拦截器或其他请求处理组件。因此,在使用该注解时,需要确保请求属性在请求处理过程中已被正确设置。

异常处理:如果@RequestAttribute注解的required属性设置为true且请求中没有找到指定的属性,则会抛出一个异常。因此,在使用该注解时,需要考虑异常处理逻辑。

类型转换:Spring MVC会自动将请求属性转换为方法参数所需的类型。如果转换失败,则会抛出一个类型转换异常。因此,在使用该注解时,需要确保请求属性的类型与方法参数的类型兼容

6. 补充

在Web开发中,“请求属性”(Request Attributes)是指与HTTP请求相关联的一组键值对数据。这些数据可以在请求的处理过程中被设置、访问和修改。请求属性通常用于在请求的不同阶段之间传递信息,例如在过滤器(Filters)、拦截器(Interceptors)、控制器(Controllers)以及视图(Views)之间。

请求属性与请求参数(Request Parameters)和请求头(Request Headers)不同。请求参数通常是通过URL查询字符串或表单数据传递的,而请求头则包含了HTTP请求的各种元数据,如内容类型、用户代理等。相比之下,请求属性是在服务器端设置的,并且对于客户端来说是不可见的。

在Spring MVC框架中,请求属性可以通过多种方式设置,包括但不限于:

  1. 过滤器(Filters):过滤器可以拦截HTTP请求,并在请求到达控制器之前设置请求属性。
  2. 拦截器(Interceptors):拦截器是Spring MVC提供的一种机制,允许在控制器方法执行之前或之后执行特定的逻辑。拦截器可以设置或修改请求属性。
  3. 控制器(Controllers):在控制器方法中,可以通过HttpServletRequest对象的setAttribute方法设置请求属性。然而,更常见的是使用Spring MVC提供的注解(如@ModelAttribute@SessionAttributes以及@RequestAttribute)来访问和设置属性。
  4. 其他请求处理组件:在请求处理流程中的其他组件(如视图解析器、视图渲染器等)也可能设置或访问请求属性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/924545.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

DAMODEL丹摩 | 关于我部署与使用FLUX.1+ComfyUI生成了一位三只手的jk美少女这回事

DAMODEL丹摩 | 关于我部署与使用FLUX.1ComfyUI生成了一位三只手的jk美少女这回事 最终效果图FLUX.1简介部署流程1. 创建资源2. 登录实例3. 部署ComfyUI4. 部署FLUX.1 使用流程1. 运行FLUX.1 导入工作流 声明&#xff1a;非广告&#xff0c;为用户使用体验分享 最终效果图 FLUX.…

Linux介绍与安装指南:从入门到精通

1. Linux简介 1.1 什么是Linux&#xff1f; Linux是一种基于Unix的操作系统&#xff0c;由Linus Torvalds于1991年首次发布。Linux的核心&#xff08;Kernel&#xff09;是开源的&#xff0c;允许任何人自由使用、修改和分发。Linux操作系统通常包括Linux内核、GNU工具集、图…

钉钉授权登录

一.找开钉钉开发平台【钉钉开放平台 (dingtalk.com)】 二。点击菜单【应用开发】->左边【钉钉应用】->【创建应用】 三。创建应用-》保存成功后&#xff0c;点击自己【新建的应用】&#xff0c;进入详细页面 四。进入应用详细页面。左边【分享设置】 注意&#xff1a;进…

【Python爬虫五十个小案例】爬取豆瓣电影Top250

博客主页&#xff1a;小馒头学python 本文专栏: Python爬虫五十个小案例 专栏简介&#xff1a;分享五十个Python爬虫小案例 &#x1fab2;前言 在这篇博客中&#xff0c;我们将学习如何使用Python爬取豆瓣电影Top250的数据。我们将使用requests库来发送HTTP请求&#xff0c;…

VUE_使用el.animate实现自定义指令抖动效果

// 在 Vue 2 中注册自定义指令 Vue.directive(shake,{// 当被绑定的元素插入到 DOM 中时inserted(el, binding){let value binding.valueconsole.log(el, binding)// 设置 transform-origin 样式el.style.transformOrigin center bottom;const keyframes [{ transform: rota…

【大模型】LLaMA-Factory的环境配置、微调模型与测试

前言 【一些闲扯】 时常和朋友闲聊&#xff0c;时代发展这么快&#xff0c;在时代的洪流下&#xff0c;我们个人能抓住些什么呢。我问了大模型&#xff0c;文心一言是这样回答的&#xff1a; 在快速发展的时代背景下&#xff0c;个人确实面临着诸多挑战&#xff0c;但同时也充满…

探索光耦:光耦安全标准解读——确保设备隔离与安全的重要规范

在现代科技日新月异的今天&#xff0c;光耦&#xff08;光电耦合器&#xff09;作为电子设备中不可或缺的隔离元件&#xff0c;其重要性不言而喻。它不仅在电源调控、工业自动化及医疗设备等关键领域大显身手&#xff0c;更是确保系统电气隔离与运行稳定的守护神。特别是在保障…

嵌入式驱动开发详解2(设备挂载问题)

文章目录 前言设备号设备号的组成设备号的分配静态分配动态分配 驱动挂载与卸载设备节点创建驱动挂载出现问题 前言 驱动的设备挂载和卸载是十分重要的内容&#xff0c;一旦操作不当可能会导致系统崩溃&#xff0c;接下来我将用字符设备的驱动挂载原理进行详细讲解&#xff0c…

Hadoop分布式文件系统(一)——HDFS简介

目录 1. HDFS设计目标2. HDFS组件3. HDFS数据复制4. HDFS健壮性4.1 磁盘数据错误&#xff0c;心跳检测和重新复制4.2 集群均衡4.3 数据完整性4.4 元数据磁盘错误4.5 快照 5. HDFS数据组织5.1 数据块存储5.2 流水线复制5.3 文件的删除和恢复 参考 1. HDFS设计目标 1.错误检测和快…

VUE练习

使用new Vue()创建Vue实例&#xff0c;传入配置对象&#xff08;el data&#xff09; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial…

论文笔记3-XCube: Large-Scale 3D Generative Modeling using Sparse Voxel Hierarchies

目录 Abtract 相关工作 核心算法&#xff1a; 整体流程概述 具体流程解析 1. 输入&#xff08;Input&#xff09; 2. 稀疏结构 VAE&#xff08;Sparse Structure VAE&#xff09; 3.分层体素潜在扩散&#xff08;Hierarchical Voxel Latent Diffusion&#xff09;…

js.二叉搜索树中第K小的元素

链接&#xff1a;230. 二叉搜索树中第 K 小的元素 - 力扣&#xff08;LeetCode&#xff09; 题目&#xff1a; 给定一个二叉搜索树的根节点 root &#xff0c;和一个整数 k &#xff0c;请你设计一个算法查找其中第 k 小的元素&#xff08;从 1 开始计数&#xff09;。 示例 1…

RabbitMQ 安装延迟队列插件 rabbitmq_delayed_message_exchange

前言&#xff1a; RabbitMQ 延迟队列插件&#xff08;rabbitmq_delayed_message_exchange&#xff09;是一个社区开发的插件&#xff0c;它为 RabbitMQ 添加了支持延迟消息的功能。通过这个插件&#xff0c;用户可以创建一种特殊的交换机类型 x-delayed-message&#xff0c;该…

Java安全—原生反序列化重写方法链条分析触发类

前言 在Java安全中反序列化是一个非常重要点&#xff0c;有原生态的反序列化&#xff0c;还有一些特定漏洞情况下的。今天主要讲一下原生态的反序列化&#xff0c;这部分内容对于没Java基础的来说可能有点难&#xff0c;包括我。 序列化与反序列化 序列化&#xff1a;将内存…

【人工智能】深入解析GPT、BERT与Transformer模型|从原理到应用的完整教程

在当今人工智能迅猛发展的时代&#xff0c;自然语言处理&#xff08;NLP&#xff09;领域涌现出许多强大的模型&#xff0c;其中GPT、BERT与Transformer无疑是最受关注的三大巨头。这些模型不仅在学术界引起了广泛讨论&#xff0c;也在工业界得到了广泛应用。那么&#xff0c;G…

d3-contour 生成等高线图

D3.js 是一个强大的 JavaScript 库&#xff0c;用于创建动态、交互式数据可视化。d3-contour 是 D3.js 的一个扩展模块&#xff0c;用于生成等高线图&#xff08;contour plots&#xff09;。 属性和方法 属性 x: 一个函数&#xff0c;用于从数据点中提取 x 坐标。y: 一个函…

Apache Zeppelin:一个基于Web的大数据可视化分析平台

今天给大家推荐一下 Apache Zeppelin&#xff0c;它是一个基于 Web 的交互式数据接入、数据分析、数据可视化以及协作文档 Notebook&#xff0c;类似于 Jupyter Notebook。 Apache Zeppelin 支持使用 SQL、Java、Scala、Python、R 等编程语言进行数据处理和分析&#xff0c;同时…

使用 pycharm 新建不使用 python 虚拟环境( venv、conda )的工程

有时候我们发现一个好玩的 demo&#xff0c;想赶快在电脑上 pip install 一下跑起来&#xff0c;发现因为 python 的 venv、conda 环境还挺费劲的&#xff0c;因为随着时间的发展&#xff0c;之前记得很清楚的 venv、conda 的用法&#xff0c;不经常使用&#xff0c;半天跑不起…

计算机网络 实验八 应用层相关协议分析

一、实验目的 熟悉CMailServer邮件服务软件和Outlook Express客户端软件的基本配置与使用&#xff1b;分析SMTP及POP3协议报文格式和SMTP及POP3协议的工作过程。 二、实验原理 为了观察到邮件发送的全部过程&#xff0c;需要在本地计算机上配置邮件服务器和客户代理。在这里我…

vue 实现关键字高亮效果

vue 实现关键字高亮效果 这是啥子意思呢&#xff0c;就是类似于百度搜索&#xff0c;根据关键词搜索结果&#xff0c;搜索结果中&#xff0c;与关键词相同的字显示红色&#xff0c;仅此而已&#xff0c;没有什么大的功能。简单写一下demo。 环境 我使用的是 vue3 ts 的语法来…