【发布时间】:2016-12-27 11:40:34
【问题描述】:
我有一个网站,人们可以在其中创建帖子并提交它们(例如在 Stackoverflow 和 Facebook 上)。
用户可以做的一件事是在提交帖子之前附上照片。因此,只要附加照片(使用 AJAX),就会在后端数据库表中为正在处理的帖子创建一个新的PostID,并将其存储在用户的SESSION 范围内,例如SESSION.LoggedIn.PostID = rsInsertedPost.PostID。
即使没有附加照片也会发生同样的事情,只是它将在帖子的最终提交时创建PostID。
我将它存储在 SESSION 范围内的原因是因为刚刚创建的 PostID 用于后端应用程序的多个其他区域(在我的例子中是 CFC 组件)。例如,它将用户与他的帖子相关联的标签插入到单独的表格dbo.PostTags 中,如下所示:
PostID | Tag
44 ColdFusion
44 Programming
44 SQL
处理完表单提交后,它将从用户的 SESSION 中删除 PostID。
我即将遇到的问题是当用户打开多个浏览器窗口并决定同时开始处理多个帖子时。 SESSION 的 PostID 值将继续被新创建的 PostID 值覆盖,这意味着如果他们决定返回不同的浏览器选项卡并提交他们的帖子,最终会影响最后创建的帖子。
有什么好的方法可以解决跟踪人们当前在每个窗口中处理的 PostID 的问题。我是否可以在 SESSION 中与 PostID 一起存储其他一些唯一属性,以便每个打开的浏览器窗口只影响该属性?
【问题讨论】:
-
这可能是反对在会话范围内存储信息的第一个论点。应对的方法是把postId放到一个隐藏的表单域或者类似的地方,在提交表单的时候进行处理。
-
@DanBracuk 没有其他选择吗?我试过看一些书,但我不确定这会出现在什么“主题”之下。您能否建议我一些可以处理这种情况的主题?
-
在隐藏字段中存储 id 有什么问题?
-
@Leigh 它可以由用户操纵,所以我想消除这种风险。我想我可能无法避免?
-
是的,这种风险适用于任何客户端编辑。尽管我假设您还验证了当前用户 ID 匹配,而不仅仅是记录 ID?也就是说,没有什么说你不能使用结构,而不是单个值。密钥可以是传回给客户端的唯一(丢弃)id。例如,一个 uuid。提交表单后,查找临时键和用户 ID。如果找到,请进行编辑并将其从结构中删除。当然,无论使用哪种方法,如果会话超时,数据都会消失..
标签: session coldfusion session-variables session-cookies session-state