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中表单的重复提交的主要内容,如果未能解决你的问题,请参考以下文章