JavaWeb Session 之表单的重复提交

来源:互联网 发布:mac 彻底删除office 编辑:程序博客网 时间:2024/05/22 10:47

原作者:尚硅谷-佟刚


1.表单的重复提交
1).表单重复提交的情况

①.在表单提交到一个Servlet,而Servlet又通过请求转发的方式响应一个JSP(HTML)页面,
此时地址栏还保留着Servlet的那个路径,在响应页面”刷新”.
②.在响应页面还没有到达时重复点击”提交按钮”.
③.点击”返回”,再点击”提交”.

注意:不是重复提交的情况:点击”返回” ,”刷新”原表单页面,再提交

2).如何避免表单的重复提交
在表单中做一个标记,提交到Servlet时,检查标记是否存在且是否和预定义的标记一致,若存在且一致,
销毁,并受理请求,若没有标记或不一致,则直接响应提示信息:”重复提交”

在原表单页面,生成一个随机值token
在原表单页面,把token值放入session属性中
在原表单页面,把token值放入到隐藏域中

在目标Servlet中:获取session和隐藏域中的token值
判断session中是否有token值,并且和隐藏域中的token值是否一致,若存在且一致,受理请求,
且把session域中的token属性值清除
若不存在或不一致,则直接响应提示页面:”重复提交”


index.jsp


  <%        String tokenValue=new Date().getTime()+"";        session.setAttribute("token", tokenValue);    %>    <form action="token" method="post">         <input type="hidden" name ="token" value="<%=tokenValue %>"/>         name:<input type="text" name="username"/>         <input type="submit" value="Submit"/>    </form>

success.jsp


<h4>欢迎</h4>

token.jsp


<h4>表单重复提交了!</h4>

TokenServlet


package com.atweihai.javaweb.review;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;public class TokenServlet extends HttpServlet{    @Override    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        //模拟网路延时        try {            Thread.sleep(2000);        } catch (InterruptedException e) {            e.printStackTrace();        }        //获取session中的token值和请求参数中的token值        HttpSession session=req.getSession();        String token=(String) session.getAttribute("token");        String tokenValue=req.getParameter("token");        System.out.println(token);        System.out.println(tokenValue);        //若session中的token值不为null 且与请求参数中的token值一致,则移除session中的token值        if(token!=null&&token.equals(tokenValue)){            session.removeAttribute("token");        }else{            //响应表单重复提交的页面            resp.sendRedirect(req.getContextPath()+"/token/token.jsp");            return;        }        String username=req.getParameter("username");        System.out.println("username:"+username);        //响应到成功页面        resp.sendRedirect(req.getContextPath()+"/token/success.jsp");    }}
原创粉丝点击