`
crazier9527
  • 浏览: 995903 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

    博客分类:
  • Java
阅读更多

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

完毕。

同时感谢:http://www.blogjava.net/mashiguang/archive/2007/08/21/138324.html

 

分享到:
评论

相关推荐

    230206-029shopDemo(JwtBearer身份认证配置的定义实现)

    /// &lt;summary&gt; /// 【签发机关】 /// &lt;remarks&gt; /// 摘要: /// 获取/设置用于生成所有令牌(Token)字符串实例,提供数据支撑的“签发机关”。 /// &lt;/remarks&gt; /// &lt;/summary&gt; public string Issuer { get; ...

    csgate.apk

    可以gate,ParseAppReportStatusMsg szText=... &lt;AppToken&gt;8bd333e2qBEdvodhJieijelck5CE9jrK&lt;/AppToken&gt; &lt;Version&gt;5200&lt;/Version&gt; &lt;AppVersion&gt;3.0.6.40&lt;/AppVersion&gt; &lt;Language&gt;ko-KR&lt;/Language&gt; &lt;/Params&gt; &lt;/Msg&gt;

    struts_jstl

    &lt;/tr&gt;&lt;br&gt; &lt;/c:forEach&gt;&lt;br&gt; &lt;/table&gt;&lt;br&gt; &lt;p&gt;&lt;br&gt; &lt;li&gt;循环控制标签:c:foreach&lt;/li&gt;&lt;br&gt;&lt;br&gt; &lt;table border="1"&gt;&lt;br&gt; &lt;tr&gt;&lt;br&gt; &lt;td&gt;姓名&lt;/td&gt;&lt;br&gt; &lt;td&gt;年龄&lt;/td&gt;&lt;br&gt; &lt;td&gt;所属组&lt;/td&gt;&lt;br&gt; &lt;/tr&gt;&lt;br&gt; &lt;c:forEach var...

    .net微信开发,封装

    ///&lt;c&gt;通过参数AppID,AppSecret,获取微信菜单,通过ytoken来创建微信菜单导航&lt;/c&gt; /// &lt;/summary&gt; // &lt;param name=" dlMenuBar"&gt;委托方法,回调取菜单栏数据&lt;/param&gt; /// &lt;param name="AppID"&gt;第三方用户唯一凭证 &lt;/...

    jsp探针 ver0.1

    java.io.BufferedReader in = new java.io.BufferedReader(new java.io.InputStreamReader( process.getInputStream())); String freeSpace = "", line; while ((line = in.readLine()) != null) { if (line.length...

    让Struts2直接支持浏览FreeMarker的FTL文件

    &lt;servlet-class&gt;org.apache.struts2.views.freemarker.FreemarkerServlet&lt;/servlet-class&gt; &lt;/servlet&gt; &lt;servlet-mapping&gt; &lt;servlet-name&gt;freemarker&lt;/servlet-name&gt; &lt;url-pattern&gt;*.ftl&lt;/url-pattern&gt; &lt;/...

    tomcat解决跨域访问问题配置

    &lt;param-value&gt;token,Access-Control-Allow-Origin,Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers&lt;/param-value&gt; --&gt; &lt;param-value&gt;Access-Control...

    java-telegram-bot-api:Java的电报Bot API

    &lt; artifactId&gt;java-telegram-bot-api&lt;/ artifactId&gt; &lt; version&gt;5.0.1&lt;/ version&gt; &lt;/ dependency&gt; 用法 // Create your bot passing the token received from @BotFather TelegramBot bot = new TelegramBot ( " ...

    struts2利用token防止表单重复提交(源代码)

    struts2防止表单重复提交,利用struts的拦截器tokenSession,轻轻松松解决表单重复提交的问题。 附件为源代码,后台延迟了3秒,可直接在web服务器下部署运行,输入用户名和密码后,多点几次提交按钮,然后看控制台...

    struts2_token控制刷新重复提交

    struts2_token控制刷新重复提交

    struts token 防止页面刷新,重复提交

    提供源代码和思想,整体架构都在,只需加入你自己的业务逻辑即可。

    cordova-plugin-parse:Parse.com 科尔多瓦插件

    科尔多瓦解析插件 ...&lt; key&gt;ParseApplicationId&lt;/ key&gt; &lt; string&gt;xxxxxxxx&lt;/ string&gt; &lt; key&gt;ParseClientKey&lt;/ key&gt; &lt; string&gt;yyyyyyy&lt;/ string&gt; &lt; key&gt;ParseEnableAutomaticUser&lt;/ key&gt; &lt; false&gt; &lt;

    ProjectOZ

    virtual, phys, modeaccess)&lt;br&gt;&lt;br&gt; MapPortal(ctx, trap, pctx, pmode, ppc, modeaccess)&lt;br&gt;&lt;br&gt; Resume()&lt;br&gt; token = Suspend()&lt;br&gt; Unsuspend(token)&lt;br&gt;&lt;br&gt;MapMemory() and MapPortal() set CONTEXT and ...

    JavaEE Struts2利用tokenSession防止重复提交

    JavaEE Struts2利用tokenSession防止重复提交

    230111-007shopDemo(Token的Postman、Swagger和Vue调试)

    options.OperationFilter&lt;AddResponseHeadersFilter&gt;(); options.OperationFilter&lt;AppendAuthorizeToSummaryOperationFilter&gt;(); // 在header中添加token,传递到后台 options.OperationFilter...

    fir.im的Android更新下载模块UpdateFun.zip

     &lt;artifactId&gt;updatefun&lt;/artifactId&gt;  &lt;version&gt;1.6.6&lt;/version&gt;  &lt;type&gt;pom&lt;/type&gt; &lt;/dependency&gt; Step 2 在Application(或者主界面activity中)的onCreate()中加上以下语句进行初始化: UpdateKey.API_...

    springcloud

    春云 ...功能调用功能区,负载均衡器,openfeign 服务降级hystrix,sentinel 服务网关zuul,gateway 服务配置config,nacoa 服务总线 java工具库hutool ...&lt;artifactId&gt;springboot-redis-token&lt;/artifactId

    C# wx获取token的基本方法

    本文实例为大家分享了C# wx获取token的具体代码,供大家参考,具体内容如下 #region 请求Url,不发送数据 /// &lt;summary&gt; /// 请求Url,不发送数据 /// &lt;/summary&gt; public static string RequestUrl(string url) { ...

    C# 语法参考

    C# 语法参考&lt;br/&gt;&lt;br/&gt;文档中描述的词法和语法以及不安全代码的语法扩展的摘要。这里,各语法产生式是按它们在主文档中出现的顺序列出的。&lt;br/&gt;&lt;br/&gt;C.1 词法&lt;br/&gt;input:(输入:) &lt;br/&gt;input-sectionopt(输入节可...

    ant学习打包代码

    &lt;replace file="input.txt" token="old" value="new" summary="on" /&gt; &lt;/target&gt; &lt;!--拷貝所有.java的文件--&gt; &lt;target name="copy"&gt; &lt;copy todir="${dist}"&gt; &lt;fileset dir="src"&gt; &lt;include name="**/*...

Global site tag (gtag.js) - Google Analytics