session------>防表单重复提交

方法一:用js控制表单提交---》但是容易在客户端被篡改代码,还是要加的

方法二:session

先给每一个表带上唯一的标志,再把标志存入session

当session中标志和表上标志都不为空 ,且相等的情况下,提交表单成功,否则失败

下面是demo

目的:访问FormServlet----->加上标记后,转发到form.jsp----->提交的DoFormServlet.java来判断标记是否相等

FormServlet.java

/**
 * 产生表单
 */
@WebServlet("/FormServlet")
public class FormServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //生产随机号
        TokenProcessor tp=new TokenProcessor();
        String token=tp.generateToken();

        //在session中存入标记
        request.getSession().setAttribute("token", token);

        //转发到form.jsp
        request.getRequestDispatcher("/form.jsp").forward(request,response);//转发

    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }

}
class TokenProcessor{//令牌
    /**
     * 1.构造方法私有
     * 2.自己构造一个
     * 3.对外暴露一个方法,允许获取上面创建的对象
     *
     */
    TokenProcessor(){};
    private static final TokenProcessor instance=new TokenProcessor();
    public static TokenProcessor getInstance(){
        return instance;
    }
    public String generateToken(){
        String token = System.currentTimeMillis()+new Random().nextInt()+"";//这里产生的随机数的长短不一样
        try {
            MessageDigest md=MessageDigest.getInstance("md5");//通过md5算法,得到数据指纹,数据指纹大小是一样的
            byte[] md5=md.digest(token.getBytes());
            //base64--->通过这个算法把字节转化成范围(0--63)键盘可见的字符(二进制的三个字节转化成四个字节)
            BASE64Encoder encoder=new BASE64Encoder();
            return encoder.encode(md5);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return null;
    }
}

form.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="/day06/DoFormServlet" method="post ">
<input type="hidden" name="token" value="${token}">
用户名:<input type="text" name="username"  />
<input type="submit" value="提交">
</body>
</html>

DoFormServlet.java

/**
 * 判断标记
 */
@WebServlet("/DoFormServlet")
public class DoFormServlet extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setCharacterEncoding("UTF_8");
		response.setContentType("text/html;charset=UTF-8");
		PrintWriter out=response.getWriter();
		boolean b=isTokenvalid(request);//判断是否重复提交
		if(!b){
			out.write("请不要重复提交表单");
			return;
		}
		request.getSession(false).removeAttribute("token");//提交成功,session标记失效
		out.write("处理表单");

	}

	/**
	 * @param request
	 * @return
	 */
	private boolean isTokenvalid(HttpServletRequest request) {
		String client_token=request.getParameter("token");//表单上的标记不为空
		if(client_token==null){
			return false;
		}
		String token=(String) request.getSession(false).getAttribute("token");
		if(token==null){//存入session中标记不为空
			return false;
		}
		if(!token.equals(client_token)){//session中的标记和表单一致,表单未被篡改
			return false;
		}
		return true;
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}
}
时间: 2024-11-11 10:20:34

session------>防表单重复提交的相关文章

10-客户端防表单重复提交和服务器端session防表单重复提交

/****************************************************DoFormServlet********************************************************/ package session; import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import

防表单重复提交

防表单重复提交 1.令牌生成器 import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Random; import sun.misc.BASE64Encoder; public class TokenProccessor { /* *单例设计模式(保证类的对象在内存中只有一个) *1.把类的构造函数私有 *2.自己创建一个类的对象 *3.对外提供一个公

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

在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复提交. 一.表单重复提交的常见应用场景 有如下的form.jsp页面 1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <!DOCTYPE HTML>

利用session防止表单重复提交

转自:http://www.cnblogs.com/xdp-gacl/p/3859416.html 利用Session防止表单重复提交 对于[场景二]和[场景三]导致表单重复提交的问题,既然客户端无法解决,那么就在服务器端解决,在服务器端解决就需要用到session了. 具体的做法:在服务器端生成一个唯一的随机标识号,专业术语称为Token(令牌),同时在当前用户的Session域中保存这个Token.然后将Token发送到客户端的Form表单中,在Form表单中使用隐藏域来存储这个Token,

PHP+SESSION防止表单重复提交

index.php 当前表单页面is_submit设为0 SESSION_START(); $_SESSION['is_submit'] = 0; <form id="reg" action="post.php" method="post">     <p>用户名:<input type="text" class="input" name="username"

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

在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复提交. 一.表单重复提交的常见应用场景 有如下的form.jsp页面 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML> <

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

申明:此文章属于转载, 转自博客: http://www.cnblogs.com/xdp-gacl/p/3859416.html在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复提交. 一.表单重复提交的常见应用场景 有如下的form.jsp页面 1 <%@ page language="java" import="java.util.*&qu

使用Session防止表单重复提交

一.表单重复提交的常见应用场景 有如下的form.jsp页面 1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <!DOCTYPE HTML> 3 <html> 4 <head> 5 <title>Form表单</title> 6 </head> 7 8 <bod

JavaWeb之——使用Session防止表单重复提交(插曲)

  转载请注明出处:http://blog.csdn.net/l1028386804/article/details/45968185 在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复提交. 一.表单重复提交的场景 有如下的form.jsp页面 <%@ page language="java" import="java.util.*"

JavaWeb学习总结(一)——使用Session防止表单重复提交

在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复提交. 一.表单重复提交的常见应用场景 有如下的form.jsp页面 1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <!DOCTYPE HTML>