防止刷新/后退引起的重复提交问题的Java Token代码,非Struts

贴子转自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{
//进行防重复提交处理流程
}

完毕。

时间: 2024-10-05 08:00:45

防止刷新/后退引起的重复提交问题的Java Token代码,非Struts的相关文章

ASP.NET Web Form和MVC中防止F5刷新引起的重复提交问题

转载  http://www.cnblogs.com/hiteddy/archive/2012/03/29/Prevent_Resubmit_When_Refresh_Reload_In_ASP_NET_Web_Form_MVC.html 什么是刷新/重新载入 IE中的刷新(Refresh),在FF和Chrome中称为重新载入(Reload),与正常进入页面的区别在于以下两点: 1. 缓存控制 如果文件(比如图片)在本地缓存中已经存在,正常进入页面会不访问服务器而直接从本地加载.而对于刷新操作,

转载: .net 防止页面刷新重复提交

题记: 在处理页面事件时,我们会经常会碰到这样的情况:当我们在提交一项页面表单时,在提交成功后,当我们试图按F5刷新页面时,数据会再次的被重复提交.那么 asp.net应用应用服务器是无法区别这是正常点击按钮添加还是f5刷新添加,那么这样就会导致在数据库里会存在n 条一莫一样的数据.为什么在原Asp开发程序中不会碰到这样的问题呢?我觉得是因为Asp程序主要都是将表单提交给另外一个页面处理,并且,这个页面处理 之后,将跳转到另外一个提示页面.那么在Asp程序中,只需要在回退时将页面设置为过期那么就

求教——使用node做表单,刷新浏览器页面,浏览器为什么会重复提交上次所填的信息

最近在学些node,按照<nodejs实战>上的代码做练习,发现有表单重复提交的问题 第一次打开页面,显示如图是get请求 图1 现在我们提交aaa,显示如图,post请求 图2 刷新页面,应该显示图1的,结果确实下面这张图,post请求.即使是按ctrl+f5刷新没用,浏览器还是重复提交了上次的内容,显示如图 图3 不断的刷就这样了,求教这个是为什么? 图4 node代码如下 var http=require("http"); var qs = require("

页面刷新重复提交

转自:http://www.lai18.com/content/9827430.html 一个很老的话题了,在提交了一个form的数据后,怎样才能防止用户直接刷新提示界面来重复提交数据呢,大至上有两个很简单的方式达到目的. 方法一.form提交处理完后用Response.Redirect跳转一下页面,使得用户无法直接刷新到form提交后的页面,这种方式麻烦就是,你想保持提交前的页面状态的话,要作需要数据接替操作,作起来相当麻烦,我用这个方法时一向都是强制丢起所有页面状态,无奈,人懒没药医. 方法

F5刷新缘何会引起表单重复提交

首先,页面第一次加载,在未进行任何操作,表单没有提交过的前提下,此时点击F5刷新,是没有任何问题的. F5刷新引起表单重复提交 前提条件: 用户已通过 (1)submit按钮 (2)js的form.submit()方式提交过表单. (3)其他方式,我不了解,希望有大神知道可以告知 提交了一次表单. 根据提交表单的方式,查看提交表单后分两种情况, get:在地址栏,可看到页面地址栏变化: ?后面是表单提交时传递的参数.毫无疑问,F5刷新时是会把这些参数重新提交的. post:chrome下打开开发

php 解决表单重复提交实现方法介绍

重复提交是我们开发中会常碰到的一个问题,除了我们使用js来防止表单的重复提交,同时还可以使用php来防止重复提交哦. 例1  代码如下 复制代码 <?php/* * php中如何防止表单的重复提交 */session_start();if (empty($_SESSION['ip'])) {//第一次写入操作,判断是否记录了IP地址,以此知道是否要写入数据库    $_SESSION['ip'] = $_SERVER['REMOTE_ADDR']; //第一次写入,为后面刷新或后退的判断做个铺垫

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

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

struts2 文件的上传下载 表单的重复提交 自定义拦截器

文件上传中表单的准备 要想使用 HTML 表单上传一个或多个文件 须把 HTML 表单的 enctype 属性设置为 multipart/form-data 须把 HTML 表单的method 属性设置为 post 需添加 <input type=“file”> 字段. Struts 对文件上传的支持 在 Struts 应用程序里, FileUpload 拦截器和 Jakarta Commons FileUpload 组件可以完成文件的上传. 步骤:1. 在 Jsp 页面的文件上传表单里使用

Struts2中解决表单重复提交

3. 表单的重复提交问题 1). 什么是表单的重复提交 > 在不刷新表单页面的前提下:  >> 多次点击提交按钮 >> 已经提交成功, 按 "回退" 之后, 再点击 "提交按钮". >> 在控制器响应页面的形式为转发情况下,若已经提交成功, 然后点击 "刷新(F5)" > 注意: >> 若刷新表单页面, 再提交表单不算重复提交 >> 若使用的是 redirect 的响应类型,