当提交一个表单将记录插入数据库并且操作成功时,我进行重定向,然后在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/ 由于我的应用程序需要大量工作来构建框架,因此该链接中提到的过滤器很容易合并,并且能够轻松实现闪存范围。
答案 0 :(得分:3)
不要在重定向中传递邮件本身。将消息存储在会话中的唯一键下,使用此消息的键重定向为URL参数,然后转到会话,获取消息并显示它。
我也会立即从会话中删除该消息:如果用户刷新,则没有理由再次告诉他插入是否成功。
大多数MVC框架都是使用他们通常称之为Flash范围的内容(会话属性一经检索就从会话中删除)。