表单重复提交解决方案(防止Http重复提交

具体的做法:在服务器端生成一个唯一的随机标识号,专业术语称为Token(令牌),同时在当前用户的Session域中保存这个Token。然后将Token发送到客户端的Form表单中,在Form表单中使用隐藏域来存储这个Token,表单提交的时候连同这个Token一起提交到服务器端,然后在服务器端判断客户端提交上来的Token与服务器端生成的Token是否一致,如果不一致,那就是重复提交了,此时服务器端就可以不处理重复提交的表单。如果相同则处理表单提交,处理完后清除当前用户的Session域中存储的标识号。
在下列情况下,服务器程序将拒绝处理用户提交的表单请求:
1.存储Session域中的Token(令牌)与表单提交的Token(令牌)不同。
2.当前用户的Session中不存在Token(令牌)。
3.用户提交的表单数据中没有Token(令牌)。
转发代码:

后端Java代码:
@WebServlet(“/DoFormServlet”)
public class DoFormServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding(“UTF-8”);
boolean flag = isFlag(req);
if (!flag) {
resp.getWriter().write(“已经提交…”);
System.out.println(“数据已经提交了..”);
return;
}
String userName = req.getParameter(“userName”);
try {
Thread.sleep(300);
} catch (Exception e) {
// TODO: handle exception
}
System.out.println(“往数据库插入数据….” + userName);
resp.getWriter().write(“success”);
}

public boolean isFlag(HttpServletRequest request) {
    HttpSession session = request.getSession();
    String sesionToken = (String) session.getAttribute("sesionToken");
    String token = request.getParameter("token");
    if (!(token.equals(sesionToken))) {
        return false;
    }
    session.removeAttribute("sesionToken");
    return true;
}

}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 591235401@qq.com

文章标题:表单重复提交解决方案(防止Http重复提交

本文作者:阿杜同学

发布时间:2019-02-11, 21:15:21

最后更新:2019-02-11, 21:15:21

原始链接:http://yoursite.com/2019/02/11/%E8%A1%A8%E5%8D%95%E9%87%8D%E5%A4%8D%E6%8F%90%E4%BA%A4%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88(%E9%98%B2%E6%AD%A2Http%E9%87%8D%E5%A4%8D%E6%8F%90%E4%BA%A4/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录