session 防止表单重复提交
防止表单重复提交应该现在前台做一遍,再在后台做一遍。这样双重安全而且减轻服务器负担。
代码:
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 防止表单重复提交的更多相关文章
- java web学习总结(十三) -------------------使用Session防止表单重复提交
		在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复提交. 一.表单重复提 ... 
- JavaWeb---总结(十三)使用Session防止表单重复提交
		在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复提交. 一.表单重复提 ... 
- [Java拾遗五]使用Session防止表单重复提交
		申明:此文章属于转载, 转自博客: http://www.cnblogs.com/xdp-gacl/p/3859416.html在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没 ... 
- java web 学习十三(使用session防止表单重复提交)
		在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复提交. 一.表单重复提 ... 
- JavaWeb学习总结(十三)——使用Session防止表单重复提交
		在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复提交. 一.表单重复提 ... 
- (转)JavaWeb学习总结(十三)——使用Session防止表单重复提交
		如何防止表单重复提交 在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复 ... 
- 使用Session防止表单重复提交
		本文出处:http://www.cnblogs.com/xdp-gacl/p/3859416.html 在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以 ... 
- javaWeb学习总结(7)- 使用Session防止表单重复提交
		在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复提交. 一.表单重复提 ... 
- JavaWeb学习 (十二)————使用Session防止表单重复提交
		在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复提交. 一.表单重复提 ... 
- 利用session防止表单重复提交
		转自:http://www.cnblogs.com/xdp-gacl/p/3859416.html 利用Session防止表单重复提交 对于[场景二]和[场景三]导致表单重复提交的问题,既然客户端无法 ... 
随机推荐
- BZOJ 2653 middle 二分答案+可持久化线段树
			题目大意:有一个序列,包含多次询问.询问区间左右端点在规定区间里移动所得到的最大中位数的值. 考虑对于每个询问,如何得到最优区间?枚举显然是超时的,只能考虑二分. 中位数的定义是在一个序列中,比中位数 ... 
- Codeforces Beta Round #6 (Div. 2 Only) D. Lizards and Basements 2 dfs
			D. Lizards and Basements 2 题目连接: http://codeforces.com/contest/6/problem/D Description This is simpl ... 
- 模板引擎之hogan.js
			hogan.js 语法简单,且支持循环数据: 基本语法: 1. 标签可以嵌套使用 2. {{data}} 转义的变量,不会渲染html标签 3. {{{data}}} 不转义的变量,会渲染html标签 ... 
- IDA Bitfields
			Bitfields There is a special kind of enums: bitfields. A bitfield is an enum where the 32bits are di ... 
- Hyper-v: Snapshot merge
			我有一个Hyper-V上的虚拟机, 在使用的过程中我给这个虚拟机创建了多个snapshots. 有一天我把整个的snapshots tree从root删掉了(delete snapshot with ... 
- sql 内连接、外连接、自然连接等各种连接
			1.内联接(典型的联接运算,使用像 = 或 <> 之类的比较运算符).包括相等联接和自然联接. 内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行.例如,检索 students和c ... 
- TurboLinux11system»adjtimex简介
			Adjtimex介绍 linux 系统有两个时钟:一个是由主板电池驱动的“Real Time Clock”也叫做RTC或者叫CMOS时钟,硬件时钟.当操作系统关机的时候,用这个来记录时间,但是对于运行 ... 
- 第十二章 Openwrt无法识别2.0 USB 盘
			今天新的U盘不能识别,还以为是U盘本身的问题,原来是缺少 kmod-usb-storage kmod-usb-storage-extras 这两个软件包. 软件包安装后重启便可识别. 
- highchart 图标技术
			1.部分html文件 <div region="center" style="width: 100%; height: 100%;"> <ta ... 
- Git 学习(二)版本库创建
			Git 版本库创建 什么是版本库(repository)? 可理解为文件仓库.由Git管理每个文件的新增.修改及删除,但这个仓库可以追溯历史.可还原至任意历史节点. 版本库创建 创建一个版本库非常简单 ... 
