struts2 防止页面重复提交

来源:互联网 发布:如何下载淘宝 编辑:程序博客网 时间:2024/05/21 07:02

关于这个问题,在网上搜索,有一大堆的解决方案,都说用token。

具体咋用呢?

参考了文章

1:http://blog.csdn.net/polisman/archive/2009/12/03/4931520.aspx

2:http://bbs.tarena.com.cn/archiver/tid-62871.html

 

写适合我自己的内容。

 

1. 建立这个token类

 
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;  
 
import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpSession;  
 
 
public class TokenProcessor {  
   private long privious;//上次生成表单标识号得时间值  
   private static TokenProcessor instance=new TokenProcessor();  
   public static String FORM_TOKEN_KEY="FORM_TOKEN_KEY";  
   private TokenProcessor(){  
         
   }  
   public static TokenProcessor getInstance(){  
       return instance;  
   }  
   /**//* 
    * 验证请求中得标识号是否有效,如果请求中的表单标识与当前用户session中的相同,返回结果true= 
    */ 
   public synchronized boolean isTokenValid(HttpServletRequest request){  
       //未避免session对象不存在时候创建Session对象  
       HttpSession session=request.getSession(false);  
       if(session==null){return false;}  
       String saved=(String)session.getAttribute(FORM_TOKEN_KEY);  
       if(saved==null){  
           return false;  
       }  
       String token=(String)request.getParameter(FORM_TOKEN_KEY);  
       if(token==null){  
           return false;  
       }  
       return saved.equals(token);  
   }  
     
   /**//* 
    * 清楚存储在当前用户session中的表单标识号 
    */ 
   public synchronized void reset(HttpServletRequest request){  
       HttpSession session=request.getSession(false);  
       if(session==null){  
           return;  
       }  
      session.removeAttribute(FORM_TOKEN_KEY);  
   }  
     
   /**//* 
    * 产生表单标识号并将之保存在当前用户得session中 
    */ 
     
   public synchronized void saveToken(HttpServletRequest request){  
       HttpSession session=request.getSession();  
       try {  
        byte id[]=session.getId().getBytes();  
        long current=System.currentTimeMillis();  
        if(current==privious){  
            current++;  
        }  
        privious=current;  
        byte now[]=String.valueOf(current).getBytes();  
        MessageDigest md=MessageDigest.getInstance("MD5");  
        md.update(id);  
        md.update(now);  
        String token=toHex(md.digest());  
        session.setAttribute(FORM_TOKEN_KEY, token);  
      } catch (NoSuchAlgorithmException e) {  
          
      }  
   }  
   /**//* 
    * 将一个字节数转换成十六进制得字符串 
    *  
    */ 
   public String toHex(byte buffer[]){  
       StringBuffer sb=new StringBuffer(buffer.length*2);  
       for (int i = 0; i < buffer.length; i++) {  
        sb.append(Character.forDigit((buffer[i]&0x60)>>4, 16));  
        sb.append(Character.forDigit(buffer[i]&0x0f, 16));  
    }  
       return sb.toString();  
         
   }  

 

 

2.jsp页面头部增加

<%

TokenProcessor tokemProcessor=TokenProcessor.getInstance();
    tokemProcessor.saveToken(request);
    String token=(String)request.getSession().getAttribute(tokemProcessor.FORM_TOKEN_KEY);
 request.setAttribute("form_token_key", tokemProcessor.FORM_TOKEN_KEY);
    request.setAttribute("token", token);

%>

<form>

<input type="hidden" name="${form_token_key }" value="${token }"/>

</form>

 

3. form提交的action中 先判断

public String save(){

 

TokenProcessor tokemProcessor=TokenProcessor.getInstance();
   if (tokemProcessor.isTokenValid(request)) {

          save();

     tokemProcessor.reset(request);//一开始这个忘记写了,差点放弃这个。哎,不仔细啊
     return Action.SUCCESS;

}else{

    tokemProcessor.saveToken(request);
    return Action.SUCCESS;

}

}

 

这样就ok了。

原创粉丝点击