Servlet/JSP-07 Session应用:避免表单重复提交

Posted byron_nj

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Servlet/JSP-07 Session应用:避免表单重复提交相关的知识,希望对你有一定的参考价值。

Session应用:避免表单重复提交

一. 表单的重复提交

1. 重复提交的情况

  ①在表单提交到一个 Servlet,而 Servlet 又通过请求转发的方式响应了一个 JSP 或者 html 页面,此时浏览器地址栏还保留着 Servlet 路径,在此响应页面点击”刷新“按钮

  ② 在响应页面尚未到达时,重复点击表单的”提交“按钮

  ③ 点击”返回“按钮或者浏览器的回退按钮,再点击”提交“按钮

 

2.如何避免表单重复提交?

原理:在表单中做一个标记,当表单提交到Servlet时,检查标记是否存在且是否和预定义的一致,若一致则受理请求,若不一致或没有标记,则提示重复提交。

方法:

  ① 仅提供一个隐藏域,<input type="hidden" name="token" value="tomas" />    无法实现:没有办法清除请求参数

  ② 把标记放在 request 中。无法实现:因为当表单页面显示后(包括刷新),本次JSP页面对应request已被销毁,在提交的时候已经是一个新的request

  ③ 把标记放在 session 中。可以实现,步骤如下:

    1> 在原表单页面,生成一个随机值(时间戳)token

    2> 在原表单页面, 将 token 值放入 session 中

    3> 在原表单页面, 将 token 值放入隐藏域中

 

    1>> 在表单提交的目标 Servlet 中,获取 session 和隐藏域中的 token 值

    2>> 比较两个值是否一致:若一致则受理请求,且把session 中的 token 值清除

    3>> 若不一致,则直接响应提示:重复提交。

    

以上是关于Servlet/JSP-07 Session应用:避免表单重复提交的主要内容,如果未能解决你的问题,请参考以下文章

session机制详解以及session的相关应用

session应用二

cookie,Session机制的本质,跨应用程序的session共享

ASP.NET下跨应用共享Session和使用Redis进行Session托管

cookie/session应用笔记

session设置获取与应用