- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
比如说,你正在提交一个表单,它会影响你的数据库(添加记录/删除它们/更新它们),这就是你的请求的样子:
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/
我不明白 int 63823 为何比 double 1.0 占用更少的空间。在这个特定实例中,int 中是否没有存储更多信息? 最佳答案 I don't understand how an int 6
这可能不是一个直接的代码问题,但它是一个经常出现在 SO 上的问题,我发现阅读它非常有用。 App Store - Help answering “Missing Compliance” (using
我在我们的应用程序中使用 syncfusion 寻呼机和下拉列表请打开以下链接。 https://stackblitz.com/edit/angular-nv6myv?file=src%2Fapp%2
以便解释指针和引用in this question我写了这段代码。 MyClass& MyClass::MyInstance() { static MyClass & myLoca
在 C 和 C++ 中,assert 是一个非常 重量级例程,将错误写入 stdout 并终止程序。在我们的应用程序中,我们实现了一个更强大的 assert 替代品,并为其提供了自己的宏。已尽一切努力
我已经创建了一个 MVC webApi 项目,现在我想使用身份验证和授权。我想我已经实现了这种安全措施,但由于某种原因,有些事情变糟了,当我编写我的凭据并尝试调用一些 webApi 方法时,显示消息“
我发现自己使用一种奇怪的方式向我的函数添加回调函数,我想知道是否有更通用的方式向函数添加回调函数,最好的情况是我的所有函数都检查最后给定的作为函数的参数,如果是,则将其用作回调。 我以前是这样的: v
几乎从来没有我只想获取某个 Remote 的情况;我总是想要所有的 Remote 。我认为这将是一个足够常见的用例,git 会考虑它(与他们有 pull.rebase true 的方式相同)。 那么,
我正在尝试使用 inarray 但它总是返回 true?有任何想法吗? (所有 li 均已显示) $("#select-by-color-list li").hide(); // get the se
我正在尝试为我公司的开发环境设置过期网址。我们使用 lighttpd在此环境中提供上传的文件,我发现 these docs这似乎相当有希望。 问题是我似乎根本无法让它工作,而且我有点不知所措,试图找出
我无法让“文件夹”外部变量工作。我总是得到[:]。 我正在 Windows 下的 Grails 上进行开发(这就是为什么外部配置文件看起来像 file:C:\path\to/file)。 我在另一个项
这个问题是出于对 PL 如何工作的好奇,而不是其他任何事情。 (它实际上是在查看与 Haskell 不同的 SML 时想到的,因为前者使用按值调用 - 但我的问题是关于 Haskell。) Haske
我有一个高速缓存内存模块,我希望它是可字寻址的,但有字节的写使能信号。 always @ (posedge clk) begin //stuff... if(write) begin
我正在处理一些代码,其中一个对象“foo”正在创建另一个对象对象“bar”,并向其传递一个Callable。之后 foo 将返回bar,然后我希望 foo 变得无法访问(即:可用于垃圾收集)。 我最初
我已将我的程序与此方法相关联: public static void CreateFileAssociation(string extension, string key, string descri
所以我正在进行目录遍历,但我无法让 opendir 按照我想要的方式工作。它总是无法打开我发送的目录,它给出了一些未知的错误。我通常传入 argv[1],但我放弃了,只是开始硬编码路径。 char *
这个问题在这里已经有了答案: How do I compare strings in Java? (23 个回答) 关闭 9 年前。 出于某种原因,我的(基本)程序总是打印我为 else 语句保留的
我不想冒为此提出破解的风险,因为它涉及 datetime 对象。基本上,我想按如下方式进行转换: 2010-04-21 06:37:53 -> 2010-04-21 06:40:00 2010-08-
我正在用 C 语言玩文件 I/O。我正在尝试使用 fgets 从一个文件中读取数据并将其输出到另一个文件。问题是它总是返回 NULL,因此没有任何内容被复制到输出文件中。这是我的代码: #includ
class MyClass { // empty class with no base class }; int main() { MyClass* myClass = new MyC
我是一名优秀的程序员,十分优秀!