Spring学习笔记_48——@SessionAttribute

Spring学习笔记_45——@ControllerAdvice
Spring学习笔记_46——@InitBinder
Spring学习笔记_47——@RequestAttribute


文章目录

    • @[toc]
      • 1. 介绍
      • 2. 场景
      • 3. 源码
      • 4. Demo
      • 5. 补充
        • 5.1 Model
        • 5.2 Session
        • 5.3 Cookie
        • 5.4 总结


1. 介绍

@SessionAttribute注解作用于处理器类上,它允许开发者有选择地指定哪些模型属性需要存储到HTTP会话(Session)中,以便在多个请求之间共享这些数据。这通常用于需要跨多个页面或请求保持数据一致性的场景,如多步骤表单处理或向导式用户界面。

@SessionAttribute注解指定属性名称就可以直接从当前Session的作用域中获取指定属性名称的值,

2. 场景

在基于SpringMVC或者SpringBoot开发Web应用程序时,如果不想通过HttpSession的getAttribute()方法从Session作用域中获取数据,而是直接通过指定的属性名称获取Session作用域中的属性值,从而实现与Servlet API进行解耦的目的

  1. 预填充表单数据:当用户访问一个表单页面时,可能需要从用户的会话中获取一些信息来预填充表单。例如,如果用户已经登录,可以从会话中获取用户名或用户ID等信息,并将其显示在表单中。
  2. 跨请求的数据共享:在一个多步骤的流程中(如一个多页的向导),可以将数据存储在会话中,然后在每个步骤之间传递这些数据,而不需要每次都通过表单或URL传递。
  3. 减少数据库查询:对于那些在多个请求中频繁使用的数据,可以考虑将它们存储在会话中,以减少对数据库的访问次数,提高应用性能。

3. 源码

@Target({ElementType.PARAMETER, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SessionAttribute {

    // String类型的属性,用于指定在Session作用域中的属性的名称
    @AliasFor("name")
    String value() default "";

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

}

4. Demo

在第一个请求中想Session中添加一个属性

@PostMapping("/login")
public String handleLogin(@RequestParam String username, @RequestParam String password, HttpSession session) {
    // 假设这里进行了验证
    User user = userService.findByUsername(username);
    if (user != null && user.getPassword().equals(password)) {
        session.setAttribute("user", user); // 将用户对象添加到会话中
        return "redirect:/home";
    } else {
        return "loginError";
    }
}

在第另一个Controller中使用

@Controller
@RequestMapping("/profile")
public class ProfileController {

    @GetMapping
    public String showProfile(@SessionAttribute("user") User user, Model model) {
        model.addAttribute("user", user); // 将用户对象添加到模型中
        return "profile"; // 返回视图名称
    }

    @PostMapping
    public String updateProfile(@SessionAttribute("user") User user, @ModelAttribute User updatedUser, Model model) {
        // 更新用户的某些属性
        userService.updateUser(user.getId(), updatedUser);
        model.addAttribute("user", updatedUser); // 更新后的用户对象
        return "profile"; // 返回视图名称
    }
}

5. 补充

5.1 Model

定义

Model 是一个接口,用于封装要传递给视图的数据。在 Spring MVC 中,Model 通常是一个 Map,其中键是字符串,值是任意对象。控制器方法可以将数据添加到 Model 中,这些数据随后会被传递给视图进行渲染。

用途

  • 数据传递:控制器方法将数据添加到 Model 中,以便视图可以使用这些数据进行渲染。
  • 视图渲染:视图引擎(如 Thymeleaf、JSP 等)会从 Model 中提取数据并将其渲染成 HTML 页面。
5.2 Session

定义

Session 是一个 HTTP 会话,用于在多个请求之间保持状态。每个客户端连接到服务器时,服务器会创建一个唯一的会话标识符(通常是 cookies 中的一个 JSESSIONID),并将会话数据存储在服务器端。

用途

  • 状态管理:在多个请求之间保持用户的状态信息,如用户身份、购物车内容等。
  • 数据共享:在不同控制器方法之间共享数据,而不需要每次都通过 URL 或表单传递。
5.3 Cookie

定义

Cookie 是一种在客户端浏览器中存储小量数据的技术。每个 cookie 都有一个名称和一个值,并且可以设置过期时间、路径等属性。

用途

  • 客户端存储:在客户端浏览器中存储少量数据,如用户偏好设置、会话标识符等。
  • 跟踪用户:通过 cookie 可以跟踪用户的行为,如记录用户的登录状态、购物车内容等。
5.4 总结
  • Model:用于在控制器和视图之间传递数据。
  • Session:用于在多个请求之间保持状态信息,数据存储在服务器端。
  • Cookie:用于在客户端浏览器中存储少量数据,数据存储在客户端。

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

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

相关文章

初识Linux—— 基本指令(下)

前言: 本篇继续来学习Linux的基础指令,继续加油!!! 本篇文章对于图片即内容详解,已同步到本人gitee:Linux学习: Linux学习与知识讲解 Linux指令 1、查看文件内容的指令 cat ​ cat 查看文件…

在SQLyog中导入和导出数据库

导入 假如我要导入一个xxx.sql,我就先创建一个叫做xxx的数据库。 然后右键点击导入、执行SQL脚本 选择要导入的数据库文件的位置,点击执行即可 注意: 导入之后记得刷新一下导出 选择你要导出的数据库 右键选择:备份/导出、…

如何进行高级红队测试:OpenAI的实践与方法

随着人工智能(AI)技术的迅猛发展,AI模型的安全性和可靠性已经成为业界关注的核心问题之一。为了确保AI系统在实际应用中的安全性,红队测试作为一种有效的安全评估方法,得到了广泛应用。近日,OpenAI发布了两…

ES 基本使用与二次封装

概述 基本了解 Elasticsearch 是一个开源的分布式搜索和分析引擎,基于 Apache Lucene 构建。它提供了对海量数据的快速全文搜索、结构化搜索和分析功能,是目前流行的大数据处理工具之一。主要特点即高效搜索、分布式存储、拓展性强 核心功能 全文搜索:…

Java项目实战II基于SPringBoot的玩具销售商城管理系统(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、核心代码 五、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着儿童娱乐与教育需求的…

Python安装出现严重错误的解决方法_0x80070643-安装时发生严重错误

使用这个软件MicrosoftProgram_Install_and_Uninstall.meta.diagcab把关于Python一个个组件全部删除,然后就能够重新安装Python了 修复阻止程序安装或删除的问题 - Microsoft 支持 这里下载

Java语言编程,通过阿里云mongo数据库监控实现数据库的连接池优化

一、背景 线上程序连接mongos超时,mongo监控显示连接数已使用100%。 java程序报错信息: org.mongodb.driver.connection: Closed connection [connectionId{localValue:1480}] to 192.168.10.16:3717 because there was a socket exception raised by…

微信小程序全局配置:导航栏、下拉刷新与上拉触底设置教程

微信小程序全局配置:导航栏、下拉刷新与上拉触底设置教程 引言 微信小程序作为一种新兴的轻量级应用,凭借其便捷性和丰富的功能受到了广泛的欢迎。在开发小程序的过程中,合理配置全局属性是提升用户体验的关键。本文将深入探讨小程序的全局配置中的window选项,重点介绍导…

YOLOv11融合[ECCV 2018]RCAN中的RCAB模块及相关改进思路

YOLOv11v10v8使用教程: YOLOv11入门到入土使用教程 YOLOv11改进汇总贴:YOLOv11及自研模型更新汇总 《Image Super-Resolution Using Very Deep Residual Channel Attention Networks》 一、 模块介绍 论文链接:https://arxiv.org/abs/1807…

linux ubuntu的脚本知

目录 一、变量的引用 二、判断指定的文件是否存在 三、判断目录是否存在 四、判断最近一次命令执行是否成功 五、一些比较符号 六、"文件"的读取和写入 七、echo打印输出 八、ubuntu切换到root用户 N、其它可以参考的网址 脚本功能强大,用起来也…

前端:JavaScript (学习笔记)【2】

目录 一,数组的使用 1,数组的创建 [ ] 2,数组的元素和长度 3,数组的遍历方式 4,数组的常用方法 二,JavaScript中的对象 1,常用对象 (1)String和java中的Stri…

【Git】工作区、暂存区和版本库

目录 一、基本概念: 关系图: 1. 工作区(Working Directory) $ 1.1 工作区功能 $ 1.2 工作区特点 2. 暂存区(Staging Area) $ 2.1 暂存区功能 $ 2.2 暂存区特点 $ 2.3 常用命令 3. 版本库&#xff08…

【Linux | 计网】TCP协议详解:从定义到连接管理机制

目录 1.TCP协议的定义: 2.TCP 协议段格式 3.TCP两种通信方式 4.确认应答(ACK)机制 解决“后发先至”问题 5.超时重传机制 那么, 超时的时间如何确定? 6.连接管理机制: 6.1.三次握手: 为什么需要3次握手,一次两次不行吗…

Springboot系列之:创建Springboot项目,Springboot整合MyBatis-plus

Springboot系列之:创建Springboot项目,Springboot整合MyBatis-plus 一、快速创建Spring boot项目二、项目完整目录三、pom.xml四、application.yaml五、实体类六、mapper七、IService接口八、Service实现类九、配置类十、枚举十一、增删改查测试类十二、…

java基础面试题笔记(基础篇)

网上始终找不到令自己满意的面试题,所以我打算自己整理面试题,从简单的到难的,尽量简单准确描述回答降低大家理解和背的难度,有错误或者有更好的回答请在评论回复我,感谢大家。 什么是java? 回答&#xff…

编译 LLVM 源码,使用 Clion 调试 clang

版权归作者所有,如有转发,请注明文章出处:https://cyrus-studio.github.io/blog/ 1. LLVM 简介 LLVM 是一个开源的编译器基础架构,最初由 Chris Lattner 于 2000 年在伊利诺伊大学开发,后来成为一个广泛应用于编译器和…

[代码随想录打卡Day22] 理论基础 77. 组合 216.组合总和III 17.电话号码的字母组合

理论基础 有递归就有回溯。回溯搜索是一种纯暴力搜索算法。我们一层一层递归到最底层收获结果,比如下面我们最后一层1操作之后,我们只有撤销这个操作回退到上一个节点才能遍历该层的其他节点,这个回退撤销操作就是回溯。 回溯法&#xff0…

大模型工程化部署:使用FastChat部署基于OpenAI API兼容大模型服务

FastChat是加州大学伯克利分校LM-SYS发布的一个用于训练、服务和评估基于大型语言模型的聊天机器人的开放平台。 项目地址:https://github.com/lm-sys/FastChat.git 其核心功能包括: 最先进 LLM 模型的权重、训练代码和评估代码。 带有 WebUI 和与 Op…

102.【C语言】数据结构之用堆对数组排序

0.前置知识 向上调整: 向下调整: 1.对一个无序的数组排升序和降序 排升序问题 建大根堆还是小根堆? 错误想法 由小根堆的定义:树中所有的父节点的值都小于或等于孩子节点的值,这样排出来的数组时升序的,建小根堆调用向上调整函数即可(把画圈的地方改成<即可) arr未…

彻底理解微服务的作用和解决方案

一.微服务有什么好处&#xff1f; 微服务优点很多&#xff0c;但是我们通常说一个东西好肯定会跟另一个东西比较&#xff0c;通常说微服务好会和单体项目进行比较&#xff0c;通常情况下微服务都是从单体项目拆分而来的&#xff0c;但是对于有些大型公司&#xff0c;不差钱&…