防止表单重复提交应该现在前台做一遍,再在后台做一遍。这样双重安全而且减轻服务器负担。

代码:

package flying.form;

import java.io.IOException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Random;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import sun.misc.BASE64Encoder;
//防止表单重复提交
public class FormServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        //产生随机数(表单号)
        TokenProcessor tp = TokenProcessor.getInstance();
        String token = tp.generateToken();
       
        request.getSession().setAttribute("token",token);
       
        request.getRequestDispatcher("/WEB-INF/form.jsp").forward(request,response);
       
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

   
    }

}

//产生随机数,相当于表单的令牌
class TokenProcessor{ //令牌
   
    private TokenProcessor() {}
    private static final TokenProcessor instance = new TokenProcessor();
   
    public static TokenProcessor getInstance() {
        return instance;
       
    }
   
    public String generateToken() {
        String token = System.currentTimeMillis()+new Random().nextInt()+"";
       
        //随机数长短不一,获取数据摘要,数据摘要始终只有128位
        try {
            MessageDigest md = MessageDigest.getInstance("md5");
            byte[] md5 = md.digest(token.getBytes());
           
            //base64编码,因为MD5返回乱码,所以用base64编码。base64把数据三个字节变成四个字节:六位一组截取数据的,前面补俩零,这样三个字节24位就会变成32位。base64中的数据从0-63共64种情况。
            BASE64Encoder encoder = new BASE64Encoder();
            return encoder.encode(md5);
           
        } catch (NoSuchAlgorithmException e) {
            // TODO Auto-generated catch block
            throw new RuntimeException(e);
        }

    }
}

 

 

 

 

package flying.form;

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

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class DoFormServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

   
    }

   
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        boolean b = isTokenValid(request);
        if(!b) {
            response.getWriter().write("<script type='text/javascript'>alert('Form repeat!');</script>");
            return;
        }
       
        request.getSession().removeAttribute("token");
       
        //doSomething
        response.getWriter().write("Success");
    }

    //判断表单号是否有效
    private boolean isTokenValid(HttpServletRequest request) {
        String client_token = request.getParameter("token");
        if(client_token==null) {
            return false;
        }
        String server_token = (String)request.getSession().getAttribute("token");
        if(server_token==null) {//已经提交过一次,被服务器删掉了session
            return false;
        }
       
        return client_token.equals(server_token);
       
    }

}

 

 

 

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>

<title>My JSP 'form.jsp' starting page</title>

</head>

<body>
    <form action="/form/servlet/DoFormServlet" method="post">
        <input type="hidden" name="token" value="${token }">
        用户名:<input    type="text" name="username"><br />
        <input type="submit" value="提交">
    </form>
</body>
</html>

session 防止表单重复提交的更多相关文章

  1. java web学习总结(十三) -------------------使用Session防止表单重复提交

    在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复提交. 一.表单重复提 ...

  2. JavaWeb---总结(十三)使用Session防止表单重复提交

    在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复提交. 一.表单重复提 ...

  3. [Java拾遗五]使用Session防止表单重复提交

    申明:此文章属于转载, 转自博客: http://www.cnblogs.com/xdp-gacl/p/3859416.html在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没 ...

  4. java web 学习十三(使用session防止表单重复提交)

    在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复提交. 一.表单重复提 ...

  5. JavaWeb学习总结(十三)——使用Session防止表单重复提交

    在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复提交. 一.表单重复提 ...

  6. (转)JavaWeb学习总结(十三)——使用Session防止表单重复提交

    如何防止表单重复提交 在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复 ...

  7. 使用Session防止表单重复提交

    本文出处:http://www.cnblogs.com/xdp-gacl/p/3859416.html 在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以 ...

  8. javaWeb学习总结(7)- 使用Session防止表单重复提交

    在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复提交. 一.表单重复提 ...

  9. JavaWeb学习 (十二)————使用Session防止表单重复提交

    在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复提交. 一.表单重复提 ...

  10. 利用session防止表单重复提交

    转自:http://www.cnblogs.com/xdp-gacl/p/3859416.html 利用Session防止表单重复提交 对于[场景二]和[场景三]导致表单重复提交的问题,既然客户端无法 ...

随机推荐

  1. bzoj 2152

    /************************************************************** Problem: 2152 User: idy002 Language: ...

  2. python开发_tarfile_文档归档压缩|解压缩

    ''' python中的tarfile模块实现文档的归档压缩和解压缩 功能: 把工作空间下面的所有文件,打包生成一个tar文件 同时提供一个方法把该tar文件中的一些文件解压缩到 指定的目录中 ''' ...

  3. layoutit note

    Head: JavaScript -> Navbar Menu: JavaScript  -> Collapse Compnents -> Panels Compnents -> ...

  4. hibernate 结合servlet及 jsp 的使用

    Hibernate结合JSP使用 前面几章详细的介绍了Hibernate的相关知识,这一章介绍Hibernate结合JSP和Servlet的使用,通过这一章的学习,可以加深对Hibernate的理解. ...

  5. Lnmmp

    简介 LNMMP=Linux+Nginx+MySQL+Memcache+PHP: 利用Nginx的高性能特点做前端反向代理服务器,分发用户请求,并在能够利用缓存的地方使用Memcache缓存服务,以加 ...

  6. Ubuntu下deb包的安装方法 - kevinhg的博客 - 博客频道 - CSDN.NET

    Ubuntu下deb包的安装方法 - kevinhg的博客 - 博客频道 - CSDN.NET dpkg -i

  7. 在WPF中实现玻璃模糊效果

    在WPF中实现玻璃模糊效果还是比较简单的,主要方式如下: 添加一个Rectangle或其它控件作为玻璃放到顶部图层 将底部图像作为Brush(大多数的时候用VisualBrush)填充到Rectang ...

  8. Current mirror drives multiple LEDs from a low supply voltage

    Driving LEDs at a regulated current from low supply voltages can be difficult because minimal overhe ...

  9. php中的var_dump()方法的详细说明

    首先看看实例: <?PHP$a = "alsdflasdf;a";$b = var_dump($a);echo "<br>";//var_du ...

  10. [Hive]使用HDFS文件夹数据创建Hive表分区

    描写叙述: Hive表pms.cross_sale_path建立以日期作为分区,将hdfs文件夹/user/pms/workspace/ouyangyewei/testUsertrack/job1Ou ...