当前位置: 首页 > wzjs >正文

做网站的人怎么联系厦门市建设厅网站

做网站的人怎么联系,厦门市建设厅网站,网络推广平台排名,温室大棚建设 网站及排名转卖在构建符合 RESTful 原则或追求用户体验流畅性的 Web 应用时,“重定向后刷新”(PRG - Post/Redirect/Get)模式是避免表单重复提交、实现页面无刷新跳转的黄金法则。然而,重定向(REDIRECT:)的本质是客户端发…

在构建符合 RESTful 原则或追求用户体验流畅性的 Web 应用时,“重定向后刷新”(PRG - Post/Redirect/Get)模式是避免表单重复提交、实现页面无刷新跳转的黄金法则。然而,重定向(REDIRECT:)的本质是客户端发起一次全新的 GET 请求,原始请求中的数据(如成功/错误消息、表单暂存值)如何在两次请求间安全传递?Spring MVC 的 FlashMapManager 接口及其配套机制,正是为解决这一核心痛点而生的优雅设计,它如同一位隐形的信使,在重定向的间隙悄然传递关键信息。

一、 核心挑战:跨重定向请求的属性传递

设想一个典型场景:

  1. 用户提交表单(POST /submit)。

  2. 服务器处理成功,需要重定向到结果页面(GET /result)以避免刷新导致重复提交。

  3. 同时,服务器需在结果页面上显示一条“操作成功”的消息。

问题核心:POST 请求处理过程中生成的“成功消息”如何安全、可靠地传递到后续的 GET 请求中?

  • HttpSession 直接存储:可行但笨重。需手动存/取/清理属性,易导致 Session 膨胀,并发场景需处理属性命名冲突。

  • URL 拼接参数:如 /result?msg=Success。暴露信息、长度受限、不适用于敏感或复杂数据。

  • 请求转发(Forward):能保留请求属性,但浏览器地址栏不更新,刷新可能导致重新提交。

FlashMapManager 的设计目标清晰:提供一种轻量级、安全、自动清理的机制,在重定向操作前暂存数据,并在重定向后的目标请求中自动恢复这些数据,且仅限一次访问

二、 FlashMap 与 FlashMapManager:协作的孪生核心

解决方案的核心是两个紧密协作的组件:

  1. FlashMap:数据的载体容器。

  • 本质是一个 Map<String, Object>,用于存储需要在重定向间传递的键值对(如 "successMessage" -> "操作成功!")。

  • 关键属性:
    targetRequestPath:指定此 FlashMap 应应用到的目标请求路径(可选,用于精确匹配)。
    expirationTime:设置过期时间戳,确保数据不会无限期驻留。

  1. FlashMapManager:接口定义管理 FlashMap 的生命周期。

public interface FlashMapManager {@NullableFlashMap retrieveAndUpdate(HttpServletRequest request, HttpServletResponse response);void saveOutputFlashMap(FlashMap flashMap, HttpServletRequest request, HttpServletResponse response);
}
  • saveOutputFlashMap(FlashMap flashMap, ...)

    • 重定向发生前(通常在 DispatcherServlet 处理内部重定向逻辑时),由框架调用。

    • 职责:将当前请求上下文中准备好的 FlashMap 安全地存储起来,供后续重定向请求检索。

    • 存储位置:通常基于 HttpSession (默认实现),也可自定义(如分布式缓存)。

  • retrieveAndUpdate(HttpServletRequest request, ...)

    • 重定向后的目标请求到达时DispatcherServlet 开始处理新请求时),由框架调用。

    • 职责:

    1. 根据当前请求信息(如路径、Session ID)查找匹配的 FlashMap

    2. 将找到的 FlashMap 中的数据提取并放入当前请求的属性中(默认属性名 DispatcherServlet.OUTPUT_FLASH_MAP_ATTRIBUTE)。

    3. 将已使用的 FlashMap 标记为过期或直接移除,确保数据仅被目标请求访问一次。

    • 返回值:找到的 FlashMap(框架内部使用)。

三、 开发者视角:简洁的 RedirectAttributes API

Spring MVC 并未让开发者直接操作底层的 FlashMapManager 和 FlashMap,而是提供了更友好、更语义化的 RedirectAttributes 接口:

public interface RedirectAttributes extends Model {RedirectAttributes addFlashAttribute(String attributeName, @Nullable Object attributeValue);RedirectAttributes addFlashAttribute(Object attributeValue);// ... 其他方法如 addAttribute (会拼接到URL)
}

使用流程 (Controller 内)

  1. 准备重定向

    @PostMapping("/submit")
    public String handleSubmit(..., RedirectAttributes redirectAttrs) {// 业务处理...// 添加 Flash 属性 (不暴露在URL)redirectAttrs.addFlashAttribute("successMessage", "数据保存成功!");// 添加普通属性 (会拼接到重定向URL)redirectAttrs.addAttribute("id", savedEntity.getId()); // -> /result?id=123return "redirect:/result";
    }
  2. 在重定向目标中获取

    @GetMapping("/result")
    public String showResult(Model model) {// Flash 属性已由框架自动从 FlashMap 取出并添加到 Model 中!// 可直接在视图中通过 ${successMessage} 访问return "resultView";
    }

设计优势

  • 高度抽象:开发者只需操作 RedirectAttributes,完全屏蔽 FlashMapManager 的复杂性。

  • 类型安全addFlashAttribute 方法清晰区分 Flash 数据与 URL 参数。

  • 自动集成:与 Spring MVC 的 Model 和视图渲染无缝结合。

四、 核心实现:SessionFlashMapManager 剖析

Spring MVC 默认提供 org.springframework.web.servlet.support.SessionFlashMapManager,其工作原理如下:

  1. 存储 (saveOutputFlashMap)

    • 获取或创建当前 Session。

    • 从 Session 中获取一个名为 FlashMapManager.FLASH_MAPS_SESSION_ATTRIBUTE 的 List<FlashMap>

    • 将待保存的 FlashMap 添加到这个 List 中。

    • 将更新后的 List 存回 Session。

  2. 检索与更新 (retrieveAndUpdate)

    • 从当前请求的 Session 中获取 List<FlashMap>

    • 遍历 List

      • 检查 FlashMap 是否过期 (expirationTime < currentTime)。

      • 检查 targetRequestPath 是否匹配当前请求路径(如果设置了)。

      • 如果找到匹配且未过期的 FlashMap

        • 将其数据放入当前请求的属性中。

        • 将其从 List 中移除(确保一次性访问)。

        • 将更新后的 List 存回 Session(移除了已使用的 FlashMap)。

    • 返回找到的 FlashMap (内部使用)。

  3. 过期清理

    • retrieveAndUpdate 方法在查找时同步清理过期项。即使目标请求未触发匹配,过期的 FlashMap 也会在下次任何请求调用 retrieveAndUpdate 时被清除。

    • 提供 setFlashMapTimeout(int seconds) 设置 FlashMap 默认存活时间(默认 180 秒)。

五、 设计精妙之处

  1. “一次性”语义保障:通过检索后立即移除的机制,严格确保 Flash 属性仅对重定向后的第一个请求可见。刷新 /result 页面不会再次显示消息,符合 PRG 模式预期。

  2. 请求隔离与精确投递

    • targetRequestPath 允许将 Flash 数据精准关联到特定目标 URL,避免在无关请求中泄露。

    • 基于 Session ID 的存储自然隔离不同用户的数据。

  3. 自动垃圾回收:内置的过期检查和清理机制有效防止 Session 因残留 FlashMap 而膨胀。

  4. 可插拔的存储策略FlashMapManager 是接口。默认 SessionFlashMapManager 适用于大多数应用。在分布式/无状态场景下,可轻松实现基于 Redis、Memcached 或数据库的 FlashMapManager 替代 Session 存储。

  5. 与框架深度集成

    • DispatcherServlet 在内部流程关键点(处理重定向前、处理新请求前)自动调用 FlashMapManager 的方法。

    • RequestMappingHandlerAdapter 在调用 Controller 方法前,将检索到的 FlashMap 数据合并到 Model 中。

六、 最佳实践与考量

  • 内容类型:适合传递短小、非敏感的即时消息(成功/失败提示)、表单校验错误对象(BindingResult)、或少量需要在重定向后页面显示的临时状态数据切勿用于传递大型对象或敏感信息。

  • 命名规范:使用清晰、一致的属性名(如 messageerrorMessageinfo)。

  • 分布式环境:默认 SessionFlashMapManager 依赖 Session 亲和性(Sticky Session)。在集群部署且 Session 不共享时,必须实现自定义的分布式 FlashMapManager

  • 自定义实现:实现 FlashMapManager 接口,重写 saveOutputFlashMap 和 retrieveAndUpdate 方法,选择所需的存储后端(如 Redis)。注册自定义 Bean 覆盖默认实现。

  • 测试:Spring 提供了 MockFlashMapManager 方便单元测试 Controller 中的重定向和 Flash 属性逻辑。

http://www.dtcms.com/wzjs/782433.html

相关文章:

  • 唐山手机网站建设帮人做网站收多少钱
  • wordpress网站服务器旅行网站模板
  • 工装网站建设方案珠海网站建设推广公司
  • 成都网站建设制作设计北京网络营销哪里实惠
  • 设计建设网站公司asp.net 网站开发
  • 深圳网站建设报价织梦网站备案
  • 网站建设行内资讯微信公众号运营教程
  • 彩票网站建设开发民宿可以在哪些网站做推广
  • 凡科建设网站怎样收录百度四川住房建设部官方网站
  • 外贸电商平台哪个网站最好怎末把域名装wordpress
  • 黄山网站建设费用内设网站
  • 工程做网站多国语言 网站源码
  • 公司网站制作汇报会一天赚50元的游戏
  • 网站访问量突然增加网站开发课程内部培训
  • .net php开发网站开发室内装修设计学习
  • 有哪些做包装盒的网站网站建设教程多少钱
  • 微网站开发难度wordpress连接discuz
  • 网站建设的工作百度怎么添加店铺地址
  • 站长工具关键词域名注册 万网
  • 中国个人优秀网站惠州市建设公司网站
  • 签订网站建设合同需要注意什么网站首页适配规则
  • 在线编程的网站看颜色应该搜索哪些词汇
  • 网站的构思做外贸网站要有域名
  • 单页导航网站模板营销型网站和传统网站区别
  • 查看网站是否备案小型网站有哪些
  • 如何用ps做照片模板下载网站许昌 网站建设
  • 网站建设与规划总结一线城市做网站工资有多少
  • 门户网站营销策略建立企业网站的形式
  • 惠州网站建设系统重庆网站seo优化
  • 对比网页设计网站云服务器可以做多个网站