【问题标题】:Servlet Forward on Post Validation Failure and Post-Redirect-Get验证后失败和重定向后获取的 Servlet 转发
【发布时间】:2013-03-06 14:55:18
【问题描述】:

处理发布到 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 wiki?不完全确定这将如何从 JSF 转换为 servlet。

【问题讨论】:

    标签: java jsp servlets


    【解决方案1】:

    据我所知,验证失败前向方法存在缺陷,不应使用。而是使用以下之一:

    1. 在会话中存储验证错误消息并进行重定向。

    2. 使用 AJAX 提交表单

    3. 使用 JavaScript 捕获客户端上的所有验证错误,并将到达服务器的验证失败视为应用程序错误,并假设有人在不使用申请表的情况下直接发布到服务器,或者申请表有错误。如果您转发到错误页面,您将遇到同样的问题,但攻击者应该得到一个自高的浏览器历史记录。如果会话可用,您可以在会话中填充错误消息并进行重定向。无论哪种方式,它都会在“正常”操作中从服务器中删除验证,并在一定程度上回避这个问题。

    【讨论】:

    • 你能解释一下为什么它有缺陷吗?
    • @"Jafar Ali" 问题在于浏览器历史记录,并确保该历史记录中的所有页面实际上都是可收藏的页面,而不是在发布后返回的页面,因为这将导致许多现代浏览器上的过期页面消息。
    猜你喜欢
    • 2013-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-17
    • 1970-01-01
    相关资源
    最近更新 更多