Servlet中表单的重复提交

Posted 超人不会飞丿

tags:

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

1.用户登录页面:

  ->设置一个UUID到session中

  ->将UUID添加到隐藏域中,提交到服务器

<%
//进入页面,设置一个UUID,将UUID添加到session中
 String token=UUID.randomUUID().toString();
 session.setAttribute("token", token); 
 %>

<form action="userlogin" method="POST"  >
    <!-- 定义一个隐藏域,将设置的Session对象UUID提交上去 -->
    <input type="hidden" value="${token}" name="token">
    用户名:<input type="text" name="username" placeholder="请输入用户名" required /><br/><br/>
    密 码:<input type="password" name="password" placeholder="请输入密码" required /><br/><br/>
    <input type="submit" value="登录"/>
</form>

2.服务器端:

  -->拿到面页传过来隐藏表单里面的token和session里面的token

  -->判断两个token是否相等,假如相等,先将之前页面上设置的session移除,再进行业务处理

  -->注意:这里移除session并不是页面中的隐藏域不会传token过来,只是穿过来的token和第一次穿过来的值不一样,这样,就避免了表单重复提交.

具体代码如下:

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * 表单重复提交验证
 * 
 * @author Decepticon
 *
 */
@WebServlet("/userlogin")
public class SubmitValidate extends HttpServlet {

    private static final long serialVersionUID = 1L;

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 获取到JSP隐藏表单里的token
        String token = request.getParameter("token");
        // 获取session对象
        HttpSession session = request.getSession();
        // 获取面页session中的token的值
        String sessionToken = (String) session.getAttribute("token");// 将面页传过来的隐藏表单中的token值和session中设置的token值做比较
            if (token.equals(sessionToken)) {
                // 如果一样,移除面页的session值
                request.getSession().removeAttribute("token");
                PrintWriter writer = response.getWriter();
                writer.write("HelloWorld!");
                writer.close();
            } else {
                PrintWriter writer = response.getWriter();
                writer.write("Please don‘t always click");
                writer.close();
            }
    }
}

 

以上是关于Servlet中表单的重复提交的主要内容,如果未能解决你的问题,请参考以下文章

HttpSession解决表单的重复提交

将表单提交到 servlet 时出现 404 错误 [重复]

JavaWeb 之 重复提交表单和验证码相关的问题!

HTML表单提交到Servlet中的乱码问题?

HttpSession之表单的重复提交 & 验证码

表单重复提交--笔记