贴子转自http://hi.baidu.com/bobylou,转之前并没有验证文章里的方法是不是有效,估计原作者把它放到blog之前应该做过测试了吧。

Struts本身有一套完善的防止重复提交表单Token(令牌)机制,但笔者目前的项目自写的framework没有用到Struts,故也得自写防止用户因为后退或者刷新来重复提交表单内容的Token机制。不难,容易实现。

实现原理:一致性。jsp生成表单时,在表单中插入一个隐藏<input>字段,该字段就是保存在页面端的token字符串,同时把该字符串存入session中。等到用户提交表单时,会一并提交该隐藏的token字符串。在服务器端,查看下是否在session中含有与该token字符串相等的字符串。如果有,那么表明是第一次提交该表单,然后删除存放于session端的token字符串,再做正常业务逻辑流程;如果没有,那么表示该表单被重复提交,做非正常流程处理,可以警告提示也可以什么也不做。

看代码。

首先是Token主类。类很简单,而且主要方法都给doc注释了

/*
* blog: http://hi.baidu.com/bobylou
* $Revision: 1.1 $
* $Date: 2007/07/18 10:02:55 $
* $Author: bobrow$
*/

package com.paizuo.framework.util;

import java.util.ArrayList;

import javax.servlet.http.HttpSession;

public class Token {

    private static final String TOKEN_LIST_NAME = "tokenList";

    public static final String TOKEN_STRING_NAME = "token";

    private static ArrayList getTokenList(HttpSession session) {
       Object obj = session.getAttribute(TOKEN_LIST_NAME);
       if (obj != null) {
          return (ArrayList) obj;
       } else {
          ArrayList tokenList = new ArrayList();
          session.setAttribute(TOKEN_LIST_NAME, tokenList);
          return tokenList;
       }
    }

    private static void saveTokenString(String tokenStr, HttpSession session) {
       ArrayList tokenList = getTokenList(session);
       tokenList.add(tokenStr);
       session.setAttribute(TOKEN_LIST_NAME, tokenList);
    }
   
    private static String generateTokenString(){
       return new Long(System.currentTimeMillis()).toString();
    }

    /**
     * Generate a token string, and save the string in session, then return the token string.
     * 
     * @param HttpSession
     *            session
     * @return a token string used for enforcing a single request for a particular transaction.
     */
    public static String getTokenString(HttpSession session) {
       String tokenStr = generateTokenString();
       saveTokenString(tokenStr, session);
       return tokenStr;
    }

    /**
     * check whether token string is valid. if session contains the token string, return true. 
     * otherwise, return false.
     * 
     * @param String
     *            tokenStr
     * @param HttpSession
     *            session
     * @return true: session contains tokenStr; false: session is null or tokenStr is id not in session
     */
    public static boolean isTokenStringValid(String tokenStr, HttpSession session) {
       boolean valid = false;
       if(session != null){
          ArrayList tokenList = getTokenList(session);
          if (tokenList.contains(tokenStr)) {
             valid = true;
             tokenList.remove(tokenStr);
          }
       }
       return valid;
    }
}


怎么使用?

在jsp页面端。

首先import该类:

<%@ page import="com.paizuo.framework.util.Token" %>

表单包含隐藏的token字符串:

<form>

<input type="hidden" name="<%=Token.TOKEN_STRING_NAME %>" value="<%=Token.getTokenString(session) %>">

</form>

在Server端action中进行检验。

if(Token.isTokenStringValid(request.getParameter(Token.TOKEN_STRING_NAME), request.getSession())){
//进行正常业务流程
}
else{
//进行防重复提交处理流程
}

完毕。

最新文章

  1. 网络第一节——NSURLConnection
  2. MySQL frm+ibd文件还原data的办法【数据恢复】
  3. import第三方库的头文件找不到的错误
  4. SQL*Loader之CASE8
  5. 菜鸟学习Andriod-弹窗
  6. Apple dev travel
  7. ASP.NET MVC- 数据验证机制
  8. linux下date命令实现时间戳与日期的转换
  9. Entrez检索实例 - NCBI
  10. hdu 4970 Killing Monsters(数学题)
  11. 应用CSS的page-break-after属性 实现WEB页面强制分页打印
  12. 2013.7.19 STL库的学习
  13. sass 与 less 的区别与学习
  14. Linux tomcat 去除项目名端口号直接用ip或者域名访问网站
  15. python IDLE中反斜杠显示为人民币符号¥的解决办法
  16. 解题(IdenticalTree--拓扑结构相同子树 )
  17. Javascript中 toFixed
  18. vue实现添加与删除图书
  19. ClassThree__HomeWork
  20. udp丢包 处理

热门文章

  1. [转]centos 下 autoconf版本升级
  2. Application Loader上传app程序
  3. StackOverflow程序员推荐的几本书籍
  4. Tcpdump命令详解
  5. jQuery入门级part.1
  6. centos7下安装vsftpd与PAM虚拟用户
  7. X-Cart 学习笔记(四)常见操作
  8. Android.mk的用法和基础【转】
  9. spring 获取 bean
  10. js 小工具-- 获取主机名