处理发布到Java Servlet的表单验证的一种策略是在验证失败时转发回原始JSP视图。这允许用户在他们刚刚提交的表单的上下文中看到验证失败(可能他们没有为必填字段提供值),然后他们可以重试。但是,由于此策略不遵循众所周知的Post-Redirect-Get模式(http://en.wikipedia.org/wiki/Post/Redirect/Get),因此浏览器历史记录现在包含不可书签的页面。如果用户稍后尝试通过历史/后退按钮访问此页面,他们将获得文档过期异常(至少在Firefox 19中)。应如何处理?还有更好的方法吗?
注意:我正在描述的策略实际上是在Servlet信息页面中推荐的:(https://stackoverflow.com/tags/servlets/info)。但是没有提到浏览器历史问题。
注意:这个问题类似:(JSF PRG with validation error)。它建议使用AJAX进行帖子。如果这是推荐的策略,我们可能需要更新Servlet维基吗?不确定这将如何从JSF转换为servlet。
答案 0 :(得分:1)
据我所知,验证失败的方法是有缺陷的,不应该使用。而是使用其中一个:
在会话中存储验证错误消息并执行重定向。
使用AJAX提交表单
使用JavaScript捕获客户端上的所有验证错误,并将到达服务器的验证失败视为应用程序错误,并假设有人在不使用应用程序表单的情况下直接发布到服务器,或者应用程序表单存在错误。如果您转到错误页面,您将遇到同样的问题,但攻击者应该获得一个惊人的浏览器历史记录。如果会话可用,您可以在会话中填写错误消息并执行重定向。无论哪种方式,它都会在“正常”操作中从服务器中删除验证并稍微回避这个问题。