Jay*_*Jay 15 java form-submit java-ee
比如说,您提交的表单会影响您的数据库(添加记录/删除/更新它们),这就是您的请求的样子:
POST/application/action = update
现在,比如说,您完成了更新,因此您希望将用户带到主页.
Response.sendRedirect/application/action = home
这非常好用.在POST之后向用户发送重定向,因此即使用户尝试通过按F5刷新页面,您也很好.但是,如果您这样做,这将无效:
调用RequestDispatcher.forward(/应用/动作=家)
鉴于在完成更新后您必须显示不同类型的错误/成功消息,您很可能在POST后执行转发.在这种情况下,您如何避免更新操作发生两次?
我觉得很有趣的是,许多安全站点(银行)/支付网关倾向于通过在屏幕上放置文本来通知用户,例如"请不要按回/刷新按钮".
有没有更好的方法来处理这个?除了要求用户不要按这些按钮?当我上次检查时,有一个叫做"垂直响应缓存"的东西.一个过滤器,用于在会话中标识您的请求的唯一性,并在请求重复时尝试发送缓存的响应.有没有更简单的方法来解决这个经典问题?
这是我正在讨论的垂直响应缓存解决方案的链接:http://www.fingo.info/en/articles/_1.html.我是,但是,不确定这真的有多好.
Lau*_*ves 12
是的,我相信你应该在POST之后重定向,但API请求除外.如果不这样做,您不仅要担心在用户使用后退按钮时获取重复的POST,而且当用户尝试使用后退按钮时,浏览器也会给用户带来恼人的对话框.
Response.sendRedirect在实践中起作用,但从技术上讲,这是为此目的发送错误的HTTP响应代码.sendRedirect发送302,但是用于将POST转换为GET的正确代码是303.(但是,如果他们为了响应POST而将其视为303,则大多数浏览器会将302视为303)
通常,您希望重定向将用户发送到任何视图以显示其更改的效果.例如,如果他们编辑窗口小部件,则应将其重定向到该窗口小部件的视图.如果他们删除了一个小部件,他们应该被重定向到小部件存在时可能出现的视图(可能是小部件列表).
有时,有一个状态消息可以进一步推动行动发生的事实.执行此操作的一种简单方法是为视图创建一个公共参数,该参数在设置时将显示操作已完成的消息.例如:
/widget?id=12345&msg=Widget+modified.
这里"msg"参数包含消息"Widget modified".这种方法的一个缺点是,恶意网站可能会给您的用户带来令人困惑/误导性的消息.例如:
/account?msg=Foo+Corp.+hates+you.
如果您真的担心这一点,可以将消息的过期签名作为附加参数包含在内.如果签名无效或已过期,则不要显示该消息.
我的一个想法是在 POST 提交的表单中嵌入一个唯一的 ID(可能是随机字符串)作为隐藏表单字段。ID字符串可以作为“交易ID”放入数据库中。现在,当你去更新数据库时,首先检查是否存在带有提交的事务ID的现有记录,如果存在,则假设它是重复的并且不要更改数据库。
当然,正如我所说,这只是一个想法。不知道实际中实际使用的是什么方法。(我怀疑很多不那么重要的网站只是忽略了这个问题,并希望他们的用户聪明……如果我见过这样的网站,那就是一个失败的提议;-)
编辑:正如评论中所指出的,在数据库中存储事务 ID 可能会占用大量空间,但如果这是一个问题,您可以保留过去 5 分钟/1 小时内处理的所有事务 ID 的内存缓存/1天/随便。除非你面对的是坚定的黑客,否则这应该有效......
| 归档时间: | 
 | 
| 查看次数: | 11166 次 | 
| 最近记录: |