您的位置:首页 > 编程语言 > Java开发

11 java 王少飞-防止表单重复提交例子

2012-11-06 20:58 274 查看
原理:

表单页面由servlet程序生成,servlet为每次产生的表单页面分配一个唯一的随机标识号,并在FORM表单的一个隐藏字段中设置这个标识号,同时在当前用户的Session域中保存这个标识号。

当用户提交FORM表单时,负责处理表单提交的serlvet得到表单提交的标识号,并与session中存储的标识号比较,如果相同则处理表单提交,处理完后清除当前用户的Session域中存储的标识号。

在下列情况下,服务器程序将拒绝用户提交的表单请求:
存储Session域中的表单标识号与表单提交的标识号不同
当前用户的Session中不存在表单标识号
用户提交的表单数据中没有标识号字段

下面是我写的代码,给大家参考一下

一个java文件(TokenProcessor),产生唯一的随机标识号

package com.hbsi.token;

import java.security.MessageDigest;

import java.security.NoSuchAlgorithmException;

import java.util.Random;

import javax.swing.plaf.basic.BasicViewportUI;

import sun.misc.BASE64Encoder;

import com.sun.corba.se.impl.protocol.giopmsgheaders.Message;

public class TokenProcessor {

private TokenProcessor(){

}

private static final TokenProcessor instance=new TokenProcessor();

public static TokenProcessor getInstance(){

return instance;

}

public String generateToken(){

int i=new Random().nextInt();

String token=System.currentTimeMillis()+i+"";

try {

MessageDigest md=MessageDigest.getInstance("md5");

byte[] md5=md.digest(token.getBytes());

BASE64Encoder encoder=new BASE64Encoder();

return encoder.encode(md5);

} catch (NoSuchAlgorithmException e) {

throw new RuntimeException(e);

}

}

}

登录的表单页面,一个servlet(FormGenerateServlet)

package com.hbsi.token;

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 FormGenerateServlet extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

response.setContentType("text/html;charset=utf-8");

PrintWriter out = response.getWriter();

TokenProcessor tp=TokenProcessor.getInstance();

String token=tp.generateToken();

request.getSession().setAttribute("token",token);

out.print("<form action='/BookHistory/FormDealServlet' method='post'>");

out.print("<input type='hidden' name='token' value='"+token+"'>" );

out.print("用户名:<input type='text' name='username'><br/>");

out.print("<input type='submit' value='提交'>");

out.print("</form>");

}

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

doGet(request, response);

}

}

处理验证唯一标识号的servlet(FormDealServlet)

package com.hbsi.token;

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 FormDealServlet extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

boolean b=isTokenValidate(request);

if(!b){

System.out.println("请不要重复提交表单");

return;

}

request.getSession().removeAttribute("token");

System.out.println("向数据库注册信息");

}

private boolean isTokenValidate(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){

return false;

}

if(!client_token.equals(server_token)){

return false;

}

return true;

}

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

doGet(request, response);

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: