`
crazier9527
  • 浏览: 1013671 次
  • 性别: 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; ...

    Net8JWTToken分布式授权身份验证源码

    private readonly ... } /// &lt;summary&gt; /// 生成token /// &lt;/summary&gt; /// &lt;param name="sub"&gt;&lt;/param&gt; /// &lt;param name="customClaims"&gt;携带的用户信息&lt;/param&gt; /// &lt;returns&gt;&lt;/returns&gt; public JwtTokenResult ...

    Java如何做到无感知刷新token含示例代码(值得珍藏)

    【Java实现无感知刷新Token详解】 在Web应用中,用户身份验证通常依赖于Token机制,如JWT(JSON Web Tokens)。然而,Token具有有效期限制,过期后可能导致用户被迫重新登录,影响用户体验。为了解决这一问题,我们...

    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;

    通过xml配置搞定Struts重复提交问题

    在Struts的配置文件(例如`struts.xml`)中,为需要防止重复提交的Action添加一个拦截器栈,包括`token`和`tokenSession`拦截器。 ```xml &lt;action name="myAction" class="com.example.MyAction"&gt; &lt;interceptor-...

    亚马逊sp-api通过api修改价格,标题

    &lt;DocumentVersion&gt;1.01&lt;/DocumentVersion&gt; &lt;MerchantIdentifier&gt;YOUR_MERCHANT_ID&lt;/MerchantIdentifier&gt; &lt;/Header&gt; &lt;MessageType&gt;Price&lt;/MessageType&gt; &lt;Message&gt; &lt;MessageID&gt;1&lt;/MessageID&gt; &lt;Price&gt; &lt;SKU&gt;...

    Java 版 Telegram Bot API.zip

    &lt;groupId&gt;com.github.pengrad&lt;/groupId&gt; &lt;artifactId&gt;java-telegram-bot-api&lt;/artifactId&gt; &lt;version&gt;7.11.0&lt;/version&gt;&lt;/dependency&gt;发布页面上包含所有依赖项的 JAR用法// Create your bot passing the token ...

    解决在struts 中可以通过token 来重复提交的问题

    ### 解决Struts中通过Token防止重复提交的问题 在Web应用程序开发中,特别是基于MVC架构的框架如Apache Struts中,确保用户操作的安全性是非常重要的。其中一项常见且重要的安全措施是防止表单的重复提交。本文将...

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

    ### Struts Token机制防止页面刷新及重复提交 在Web应用开发过程中,特别是在使用MVC框架如Apache Struts进行开发时,防止表单重复提交是一个重要的安全措施。表单重复提交通常发生在用户点击“提交”按钮后,由于...

    【原创】Struts2防止表单重复提交.doc

    本文详细介绍了如何在Struts2框架中使用`&lt;s:token/&gt;`标签和`token`拦截器来防止表单重复提交。通过这种方式,可以有效地避免因重复提交而导致的数据冗余和其他潜在问题。对于开发者来说,理解和掌握这些技术是非常...

    sturts2防止表单的重复提交 token

    Struts2为解决这个问题引入了Token机制,确保每个表单提交只被处理一次,避免了由于用户意外刷新页面导致的重复请求。 首先,我们来了解一下什么是表单重复提交问题。当用户填写并提交一个表单后,如果网络延迟或者...

    Web-API接口设计经验总结.docx

    /// &lt;param name="token"&gt;用户访问令牌&lt;/param&gt; /// &lt;returns&gt;&lt;/returns&gt; [HttpPost] public CommonResult ModifyPassword(JObject param, string token) { // 令牌检查,不通过则抛出异常 CheckResult ...

    ChatGPT Java SDK 支持 GPT-4o、 GPT4 API 开箱即用 一个非官方 Java SDK,可与 ChatGPT 的 GPT-3.5 和 GPT-4 API 无缝集成 即.zip

    迷你 以及函数调用 以及流程对话 以及环境 以及計算Token 以及多KEY轮询 以及代理 以及遠向代理 以及使用指南参考Demo https://github.com/PlexPt/chatgpt-online-springboot结论maven&lt;dependency&gt; &lt;groupId&gt;...

    .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;/...

    MapReduce WordCount Java API代码实现,包括pom.xml的配置

    在MapReduce WordCount程序中,我们需要Hadoop库的依赖,以便运行和编译Java代码。以下是一个典型的`pom.xml`配置: ```xml &lt;project xmlns=...

    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_token控制刷新重复提交

    Struts2是一个非常流行的Java Web框架,用于构建和维护可扩展且易于管理的企业级应用...综上所述,Struts2的Token机制是防止Web应用中重复提交的有效工具,通过合理的配置和编程,可以为用户的操作提供更安全的环境。

    Struts2防止重复提交解决方案

    在Struts2中,防止重复提交是一个重要的问题,因为它可能导致数据不一致性和服务器资源的浪费。本文将详细介绍如何在Struts2中解决这个问题,以及相关的技术概念。 首先,我们要理解Struts2中的拦截器(Interceptor...

    Struts2防止表单重复提交示例

    Struts2是一个流行的Java ...总结来说,Struts2通过Token机制有效地解决了表单重复提交的问题,提高了Web应用的健壮性。通过合理的配置和拦截器的使用,开发者可以轻松地集成这一功能,确保每个表单请求只被处理一次。

Global site tag (gtag.js) - Google Analytics