前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >Flash Scope

Flash Scope

作者头像
四火
发布2022-07-15 19:42:03
发布2022-07-15 19:42:03
1.8K0
举报
文章被收录于专栏:四火的唠叨四火的唠叨

项目中遇到了一个潜在的问题,大致就是说,在一个流程的两个或某几个环节中,需要短暂地存储一部分对象(如果不存储,就需要在这几个环节中多次调用同一个外部接口,这被认为是不够合理的实现)。

而这部分对象的存储:

(1)如果用 request,太小,毕竟一次提交以后就丢失了,如果需要往后传递,可能需要借助一些页面参数传值等丑陋或是不易控制的方法;

(2)如果用 session,太大,我不需要在整个用户会话生命周期内使用,而且如果同个用户并行地操作两个流程,期间会互相影响到。

其实在 Rails/Grails 里面就已经包含了一个机制,它将对象短暂地放置在 session 中,request-response 连续的两个环节后再清除掉这个短暂保存的对象,就叫是 Flash Scope。

它的原理很简单,内部定义了两个 Map,将保存在里面的数据,在两个 Map 里面来回转移,这样就保证在下一次请求到来时,只需要将其中一个 Map 的数据转移到另外一个 Map 中,而清除掉一个 Map。这样就保证一次在重定向时,该作用域下依然保存数据。而在第二次的请求时,如果没有新的数据加进来,原来的数据将会被清空。

这里有一个简单的例子:http://yongtree.javaeye.com/blog/629572

看起来好像结束了,不过,把思路扩展一下:

(1)这样的做法可以支持若干次的 request-response,一串这样的 requset-response 就可以成为一条工作流。

(2)上面的做法解决了对象在对个环节中传递的问题,那么,怎样解决在同个用户并行地操作两个流程时,会互相影响到的问题?

我想其实也不难,只需要稍稍扩展一下,如果这样的问题确实需要解决,那就在存入这个短命对象到 Map 时,使用的 key 需要包含一个唯一序列 x,而这个 x 最易想到的就是以系统当前时间为参数,让这个 x 作为 hidden 参数的形式经由页面传递,从而保证了一整条工作流中行为的独立性。

我画一个简单的时序图来说明:

文章未经特殊标明皆为本人原创,未经许可不得用于任何商业用途,转载请保持完整性并注明来源链接 《四火的唠叨》

×Scan to share with WeChat

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档