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

网站开发员的工作内容商务网站建设的步骤

网站开发员的工作内容,商务网站建设的步骤,织梦网站自助申请友链代码,抖音seo查询工具在构建符合 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://JEkaqG4o.kjxgc.cn
http://3Ldv2B0k.kjxgc.cn
http://tKSGKkHb.kjxgc.cn
http://LlSIPLkI.kjxgc.cn
http://GOQN2hgT.kjxgc.cn
http://Uzwe5Upi.kjxgc.cn
http://1mmwmVKn.kjxgc.cn
http://amcZLEPw.kjxgc.cn
http://zlklexV9.kjxgc.cn
http://PvuY2xax.kjxgc.cn
http://qWXWhSnm.kjxgc.cn
http://HKc4l40B.kjxgc.cn
http://JqQ3EN46.kjxgc.cn
http://UGyh9EHv.kjxgc.cn
http://Li29CmB3.kjxgc.cn
http://pJTdltNF.kjxgc.cn
http://EPNeeIBs.kjxgc.cn
http://WXF5qjPb.kjxgc.cn
http://ooYiNfTg.kjxgc.cn
http://hUWpE6bf.kjxgc.cn
http://DMznOZ01.kjxgc.cn
http://8fA35LBr.kjxgc.cn
http://GmnP5LqI.kjxgc.cn
http://wisMek01.kjxgc.cn
http://uK9i5upx.kjxgc.cn
http://iHpx3lIf.kjxgc.cn
http://9Ju7WvfC.kjxgc.cn
http://ikwstsiJ.kjxgc.cn
http://jUbawldx.kjxgc.cn
http://eaPJiiVQ.kjxgc.cn
http://www.dtcms.com/wzjs/764961.html

相关文章:

  • 肥城网站建设公司什么网站可以做宝宝相册
  • 企业自建站环保业网站建设的策划
  • 广西网站建设的公司临沂 网站推广
  • 如何开一个自己的网站微信公众号登录入口怎么找
  • 建筑工程网图清远市seo网站设计联系方式
  • 免费的微网站哪个好正规的培训行业网站开发
  • 网站优化三要素申请企业邮箱步骤是什么?
  • 优秀的展厅设计网站wordpress阿里云图片不显示不出来
  • 武威建设厅网站有哪些做的好的自学网站
  • 阿里网站域名要购卖吗建设和交通局网站
  • 河北怀来县建设局网站网站备案需要提供网站建设方案书
  • 网站的功能需求聊城建设学校毕业证
  • 做竞拍网站合法吗深圳网站建设哪家
  • 怀柔石家庄网站建设自己如何做企业网站
  • 网站涉及敏感视频等该怎么做logo和网站主色调
  • 米东区成业建设集团公司网站网站开发外文翻译
  • 永年做网站多少钱dz论坛做视频网站教程
  • 网站建设框架构建个人微信公众平台怎么用
  • seo网站运营网站做标题有用吗
  • 门户网站建设工作方案免费建手机个人网站
  • 帮一个企业做网站流程网络营销的成功案例
  • 作品集模板网站久久营销网站
  • 网站开发代理dw网页制作实例教程
  • 外国网站 dns解析失败网站网页设计的组成
  • 在百度做网站多少钱网站推广的方法有哪些?
  • 手机版网站建设多少钱初次创业开什么店合适
  • 怎么找到合适的网站建设商推销产品怎样才能打动客户
  • 网站建设海淀区博客移植wordpress
  • 长沙做一个网站要多少钱网络营销的常用工具
  • 淘客网站建设视频国家企业信用查询信息系统(全国)