利用JSP,防止重复提交的问题

    一般,在很多应用系统中,用户多次提交重复数据是一个很严重的问题,会导致应用系统中很多垃圾数据,在Struts中框架中,有TOKEN机制来防止用户提交重复数据,这是一个很好的办法,但是,TOKEN机制必须得用到html:form标签,我不喜欢用这个标签,我觉得是一个累赘,所以我去掉HTML:FORM标签,重新定义TOKEN机制,方法如下:

1、创新新类,TokenProcess

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、在Action中调用其方法,生成其隐含字段值:

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);

3、在JSP页面中获取属性值(此处我用EL表达式取值),生成一隐含字段:

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

4、在提交方法中,写上防止重复提交的代码:

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

                 Your code is here!3Q!

        }else{

               saveToken(request);

                Your code!

         }

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值