gpt4 book ai didi

java - 你总是在 POST 后重定向吗?如果是,您如何管理它?

转载 作者:太空狗 更新时间:2023-10-29 22:55:12 25 4
gpt4 key购买 nike

比如说,你正在提交一个表单,它会影响你的数据库(添加记录/删除它们/更新它们),这就是你的请求的样子:

POST/application/action=更新

现在,比方说,您已完成更新,因此您希望将用户带到主页。

Response.sendRedirect/application/action=home

这非常有效。在 POST 后向用户发送重定向,因此即使用户尝试通过按 F5 刷新页面,也没有问题。但是,如果您这样做,这将不起作用:

requestDispatcher.forward(/application/action=home)

鉴于在完成更新后必须显示不同类型的错误/成功消息的情况,您很可能在 POST 之后执行转发。在这种情况下,如何避免更新操作发生两次?

我觉得很有趣,许多安全站点(银行)/支付网关倾向于通过在屏幕上放置文本来通知用户,例如“请不要按返回/刷新按钮”。

有没有更好的方法来处理这个问题?除了要求用户不要按下这些按钮?当我上次检查时,有一种叫做“垂直响应缓存”的东西。一个过滤器,它将识别您的请求在 session 中的唯一性,并在请求重复时尝试发送缓存的响应。有没有更简单的方法来解决这个经典问题?

这是我所说的垂直响应缓存解决方案的链接:http://www.fingo.info/en/articles/_1.html .但是,我不确定这到底有多好。

最佳答案

是的,我认为您应该在 POST 之后重定向,但 API 请求除外。如果不这样做,您不仅要担心在用户使用后退按钮时会收到重复的 POST,而且当用户尝试使用后退按钮时,浏览器还会给用户带来烦人的对话框。

Response.sendRedirect 在实践中有效,但从技术上讲,这是为此发送了错误的 HTTP 响应代码。 sendRedirect 发送 302,但用于将 POST 转换为 GET 的正确代码是 303。(但是,大多数浏览器在响应 POST 时会像 303 一样对待 302)

通常,您希望重定向将用户发送到任何将显示其更改效果的 View 。例如,如果他们编辑一个小部件,他们应该被重定向到该小部件的 View 。如果他们删除了一个小部件,他们应该被重定向到该小部件存在时会出现的 View (可能是小部件列表)。

有时有一个状态消息来进一步明确一个 Action 发生的事实是很好的。一个简单的方法是为您的 View 设置一个通用参数,设置后将显示操作完成消息。例如:

/widget?id=12345&msg=Widget+modified.

这里的“msg”参数包含消息“Widget modified”。这种方法的一个缺点是恶意站点可能会向您的用户提供令人困惑/误导的消息。例如:

/account?msg=Foo+Corp.+hates+you.

如果您真的担心这一点,您可以将消息的过期签名作为附加参数包含在内。如果签名无效或已过期,则不显示该消息。

关于java - 你总是在 POST 后重定向吗?如果是,您如何管理它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1083357/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com