如何在表单提交后显示消息并且是幂等的

时间:2012-09-19 21:12:23

标签: java jsp servlets idempotent

当提交一个表单将记录插入数据库并且操作成功时,我进行重定向,然后在Url中传递一些参数以显示新插入的记录以及标题消息(即&#34 ;插入成功")。

response.sendRedirect(yPage + "?pid=" + ipd + "&feedback=" + form.getFormFeebackSB() );

然后我会在jsp中显示: <c:out value="${param.feedback}" />

我使用重定向而不是前向,因为我希望操作是幂等的。当我使用forward用户在成功插入后点击刷新时,通常会在警告弹出窗口中单击重试,这会导致重复插入。

我们的IT部门随后发现我有一个XSS漏洞:

page.jsp?feedback=%3Cscript%20type=%22text/javascript%22%3Ealert%28%27xss%27%29;%3C/script%3E

所以我改为: <c:out value="${param.feedback}" escapeXml='true'/>

但现在我的FeedbackSB中的任何<br>都会被转义,我最终会收到一条标题消息

Insert was successful<br>An email was sent to Joe<br>Now Complete the XYZ Form;

将消息传递给用户的标准方法是什么,同时保持任何提交是幂等的并防止XSS?

编辑:

我搜索了Flash Scope并遇到了这个http://blog.smartkey.co.uk/2011/01/implementing-flash-scope-in-java-web-applications/ 由于我的应用程序需要大量工作来构建框架,因此该链接中提到的过滤器很容易合并,并且能够轻松实现闪存范围。

1 个答案:

答案 0 :(得分:3)

不要在重定向中传递邮件本身。将消息存储在会话中的唯一键下,使用此消息的键重定向为URL参数,然后转到会话,获取消息并显示它。

我也会立即从会话中删除该消息:如果用户刷新,则没有理由再次告诉他插入是否成功。

大多数MVC框架都是使用他们通常称之为Flash范围的内容(会话属性一经检索就从会话中删除)。