Spring学习笔记_48——@SessionAttribute

news2024/11/25 9:04:39

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:用于在客户端浏览器中存储少量数据,数据存储在客户端。

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

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

相关文章

【CS61A 2024秋】Python入门课,全过程记录P2(Week3开始,更新中2024/11/24)

文章目录 关于基本介绍👋Week 3Mon Environments阅读材料Lab 02: Higher-Order Functions, Lambda ExpressionsQ1: WWPD: The Truth Will PrevailQ2: WWPD: Higher-Order FunctionsQ3: WWPD: Lambda 关于 个人博客,里面偶尔更新,最近比较忙。…

在Linux下配置gitee与Github的远程仓库

目录 前言 云服务器下载git 检测是否下载成功git Linux下配置gitee远程仓库 代码提交演示 git三板斧 Linux下配置Github远程仓库 最后的提醒 前言 那么本篇文章将是在,你已经创建了本地仓库的基础上,在Linux下配置gitee的远程仓库的步骤&#xff…

Mac配置maven环境及在IDEA中配置Maven

Mac配置maven环境及在IDEA中配置Maven 1. 介绍 Maven是一款广泛用于Java等JVM语言项目的工具,它以项目对象模型(POM)为基础进行项目管理,通过POM文件来定义项目信息和依赖关系。同时,它也是构建自动化工具&#xff0…

硬中断关闭后的堆栈抓取方法

一、背景 性能和稳定性是一个计算机工程里的一个永恒的主题。其中尤其稳定性这块的问题发现和问题分析及问题解决就依赖合适的对系统的观测的手段,帮助我们发现问题,识别问题原因最后才能解决问题。稳定性问题里尤其底层问题里,除了panic问题…

STL关联式容器之hashtable

hashtable的桶子与节点 下图为开链法(separate chaining)完成hashtable的图形表述。为了剖析SGI STL源码,我们遵循SGI的命名,称hash table表格内的元素为桶(bucket),此名称的大约意义是,表格内的每个单元,涵盖的不只是个节点(元素…

基于python的长津湖评论数据分析与可视化,使用是svm情感分析建模

引言 研究背景及意义 上世纪初开始,中国电影就以自己独有的姿态登上了世界电影史的舞台。中国电影作为国家文化和思想观念的反映与延伸,能够增强文化自信,在文化输出方面有着极其重要的作用1[1]。 改革开放以来,随着生产力的提高…

阿里云oss转发上线-实现不出网钓鱼

本地实现阿里云oss转发上线,全部代码在文末,代码存在冗余 实战环境 被钓鱼机器不出网只可访问内部网络包含集团oss 实战思路 若将我们的shellcode文件上传到集团oss上仍无法上线,那么就利用oss做中转使用本地转发进行上线,先发送…

预测未来 | MATLAB实现Transformer时间序列预测未来

预测未来 | MATLAB实现Transformer时间序列预测未来 预测效果 基本介绍 1.Matlab实现Transformer时间序列预测未来; 2.运行环境Matlab2023b及以上,data为数据集,单变量时间序列预测; 3.递归预测未来数据,可以控制预…

局域网与广域网:探索网络的规模与奥秘(3/10)

一、局域网的特点 局域网覆盖有限的地理范围,通常在几公里以内,具有实现资源共享、服务共享、维护简单、组网开销低等特点,主要传输介质为双绞线,并使用少量的光纤。 局域网一般是方圆几千米以内的区域网络,其特点丰富…

可视化建模与UML《协作图实验报告》

有些鸟儿毕竟是关不住的。 一、实验目的: 1、熟悉协作图的构件事物。 2、掌握协作图的绘制方法。 二、实验环境: window7 | 10 | 11 EA15 三、实验内容: 下面列出了打印文件时的工作流: 用户通过计算机指定要打印的文件。(2)打…

docker搭建私有的仓库

docker搭建私有仓库 一、为什么要搭建私有的仓库? 因为在国内,访问:https://hub.docker.com/ 会出现无法访问页面。。。。(已经使用了魔法) 当然现在也有一些国内的镜像管理网站,比如网易云镜像服务、Dao…

微信小程序条件渲染与列表渲染的全面教程

微信小程序条件渲染与列表渲染的全面教程 引言 在微信小程序的开发中,条件渲染和列表渲染是构建动态用户界面的重要技术。通过条件渲染,我们可以根据不同的状态展示不同的内容,而列表渲染则使得我们能够高效地展示一组数据。本文将详细讲解这两种渲染方式的用法,结合实例…

订单日记为“惠采科技”提供全方位的进销存管理支持

感谢温州惠采科技有限责任公司选择使用订单日记! 温州惠采科技有限责任公司,成立于2024年,位于浙江省温州市,是一家以从事销售电气辅材为主的企业。 在业务不断壮大的过程中,想使用一种既能提升运营效率又能节省成本…

mysql-分析并解决可重复读隔离级别发生的删除幻读问题

在 MySQL 的 InnoDB 存储引擎中,快照读和当前读的行为会影响事务的一致性。让我们详细分析一下隔离级别味可重复读的情况下如何解决删除带来的幻读。 场景描述 假设有一个表 orders,其中包含以下数据: 事务 A 执行快照读 START TRANSACTION…

使用itextpdf进行pdf模版填充中文文本时部分字不显示问题

在网上找了很多种办法 都解决不了; 最后发现是文本域字体设置出了问题; 在这不展示其他的代码 只展示重要代码; 1 引入扩展包 <dependency><groupId>com.itextpdf</groupId><artifactId>itext-asian</artifactId><version>5.2.0</v…

链表刷题|判断回文结构

题目来自于牛客网&#xff0c;本文章仅记录学习过程的做题理解&#xff0c;便于梳理思路和复习 我做题喜欢先把时间复杂度和空间复杂度放一边&#xff0c;先得有大概的解决方案&#xff0c;最后如果时间或者空间超了再去优化即可。 思路一&#xff1a;要判断是否为回文结构则…

0基础跟德姆(dom)一起学AI NLP自然语言处理01-自然语言处理入门

1 什么是自然语言处理 自然语言处理&#xff08;Natural Language Processing, 简称NLP&#xff09;是计算机科学与语言学中关注于计算机与人类语言间转换的领域. 2 自然语言处理的发展简史 3 自然语言处理的应用场景 语音助手机器翻译搜索引擎智能问答...

Linux系统使用valgrind分析C++程序内存资源使用情况

内存占用是我们开发的时候需要重点关注的一个问题&#xff0c;我们可以人工根据代码推理出一个消耗内存较大的函数&#xff0c;也可以推理出大概会消耗多少内存&#xff0c;但是这种方法不仅麻烦&#xff0c;而且得到的只是推理的数据&#xff0c;而不是实际的数据。 我们可以…

跨平台开发_RTC程序设计:实时音视频权威指南 2

1.2.1 一切皆bit 将8 bit分为一组&#xff0c;我们定义了字节(Byte)。 1956年6月&#xff0c;使用了Byte这个术语&#xff0c;用来表示数字信息的基本单元。 最早的字节并非8 bit。《计算机程序设计的艺术》一书中的MIX机器采用6bit作为1Byte。8 bit的Byte约定&#xff0c;和I…

WIFI:长GI与短GI有什么区别和影响

1、GI的作用 Short GI(Guard Interval)是802.11n针对802.11a/g所做的改进。射频芯片在使用OFDM调制方式发送数据时&#xff0c;整个帧是被划分成不同的数据块进行发送的&#xff0c;为了数据传输的可靠性&#xff0c;数据块之间会有GI&#xff0c;用以保证接收侧能够正确的解析…