javaweb防止表单重复提交

实现思路:
在访问表单的jsp页面之前,首先随机生成一个token(令牌),然后在访问表单的页面放置一个隐藏域,在表单提的时候判断客户端请求的token和服务器端的token是否一致,一致放行,不一致返回。

在这里插入图片描述

@WebServlet(name = "BeforeServlet", urlPatterns = "/BeforeServlet")
public class BeforeServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String token = UUID.randomUUID().toString();
        System.out.println("生成的token:" + token);
        request.getSession().setAttribute("token", token);
        request.getRequestDispatcher("/index.jsp").forward(request, response);
    }
}
<%@ page contentType="text/html;charset=UTF-8" import="java.util.*" language="java" %>
<html>
<head>
    <title>表单提交</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/FormServlet" method="post">
    <input name="token" type="hidden" value="<%=session.getAttribute("token") %>">
    用户名: <input type="text" name="username"><br/>
    <input type="submit" value="提交">
</form>
</body>
</html>

@WebServlet(name = "FormServlet",urlPatterns = "/FormServlet")
public class FormServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
          doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
          request.setCharacterEncoding("UTF-8");
          String username=request.getParameter("username");
          boolean b= isFormSubmit(request);
          if (b==true){
              System.out.println("请不要重复提交表单!!!!!!!!!!!!!");
              return;
          }
          request.getSession().removeAttribute("token");
    }

    public  boolean isFormSubmit(HttpServletRequest request) {
         //获取页面的token
        String token= request.getParameter("token");
        if (token==null){
            return true;
        }
        //获取服务器生成的token
       String ftoken=(String) request.getSession().getAttribute("token");
        if (ftoken==null){
            return true;
        }
        if (!ftoken.equals(token)){
             return true;
        }
        return false;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值