`

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

    博客分类:
  • java
 
阅读更多

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

完毕。

分享到:
评论

相关推荐

    Struts2 struts-2.3.16.1版本下的demo

    纯Struts2 struts-2.3.16.1版本下的demo,1、Struts2标签 2、Action 3、ActionSupport中validate 4、prepare 5、modeldriven 6、国际化 7、Token 8、拦截器

    java-jwt.jar

    实现Java web token JWT所需的jar包,java-jwt.3.3.0.jar,可用于登录验证

    Java开发案例-springboot-34-整合Sa-Token实现权限认证-源代码+文档.rar

    Java开发案例-springboot-34-整合Sa-Token实现权限认证-源代码+文档.rar Java开发案例-springboot-34-整合Sa-Token实现权限认证-源代码+文档.rar Java开发案例-springboot-34-整合Sa-Token实现权限认证-源代码+文档....

    PyPI 官网下载 | cloudtoken-plugin.adfs-0.1.11.tar.gz

    《PyPI与cloudtoken-plugin.adfs-0.1.11: Python库的深度解析》 PyPI(Python Package Index)是Python编程语言的官方软件仓库,它为全球的Python开发者提供了一个集中发布和获取Python软件包的平台。在PyPI上,...

    token-provider-1.0.1-API文档-中英对照版.zip

    赠送jar包:token-provider-1.0.1.jar; 赠送原API文档:token-provider-1.0.1-javadoc.jar; 赠送源代码:token-provider-1.0.1-sources.jar; 赠送Maven依赖信息文件:token-provider-1.0.1.pom; 包含翻译后的API...

    token-provider-1.0.1-API文档-中文版.zip

    赠送jar包:token-provider-1.0.1.jar; 赠送原API文档:token-provider-1.0.1-javadoc.jar; 赠送源代码:token-provider-1.0.1-sources.jar; 赠送Maven依赖信息文件:token-provider-1.0.1.pom; 包含翻译后的API...

    commons-lang.jar

    commons-lang.jar、Apache Commons包中的一个,包含了一些数据类型工具类,是java.lang.*的扩展。必须使用的jar包。 Jar文件包含的类: META-INF/MANIFEST.MFMETA-INF/LICENSE.txtMETA-INF/NOTICE.txtorg.apache....

    struts2_token控制刷新重复提交

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

    Python库 | django_request_token-0.14.1-py3-none-any.whl

    **Python库 django_request_token-0.14.1-py3-none-any.whl** 这个压缩包文件`django_request_token-0.14.1-py3-none-any.whl`是针对Python开发的一个库,名为`django_request_token`,版本号为0.14.1。该库特别...

    taobao-sdk-java-auto_1479188381469-20191021.jar

    钉钉 Java SDK 钉钉官方提供了统一的SDK,使用SDK可以便捷的调用服务端API。注意:此SDK包含原有TOP接口,原有TOP接口可以继续正常调用,没有影响。下面是使用SDK调用API的请求示例: JAVA: DingTalkClient client...

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

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

    wstx-asl-3.2.9.jar

    总的来说,"wstx-asl-3.2.9.jar" 文件是XML处理的关键组件,而 "Expected a text token, got START_ELEMENT" 错误提示则意味着在处理XML流时出现了结构上的问题,需要对XML文档和解析代码进行深入检查。结合Apache ...

    nacos-server-2.2.0.zip

    github因网络问题下载特慢,基于java8源码编译的nacos-server-2.2.0.zip 官网描述: 在2.2.0.1和2.2.1版本时,必须开启鉴权,否则无法启动;其他版本为建议设置。 启动之前修改配置文件 修改conf目录下的application....

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

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

    java-gitlab-api-master.zip

    除了这些基础操作,你还可以通过这个Java库实现更多高级功能,如提交代码、创建分支、管理标签、触发持续集成/持续部署(CI/CD)流程等。在实际开发中,需要熟悉GitLab API的文档,了解每个端点的具体用法,并结合`...

    Java开发案例-springboot-整合Sa-Token-Quick-Login插件实现快速登录认证-源代码+文档.rar

    Java开发案例-springboot-整合Sa-Token-Quick-Login插件实现快速登录认证-源代码+文档.rar Java开发案例-springboot-整合Sa-Token-Quick-Login插件实现快速登录认证-源代码+文档.rar Java开发案例-springboot-整合Sa...

    PyPI 官网下载 | cloudtoken_plugin.centrify-0.1.48-py3-none-any.whl

    资源来自pypi官网。 资源全名:cloudtoken_plugin.centrify-0.1.48-py3-none-any.whl

    Python库 | cloudtoken-0.1.43-py3-none-any.whl

    资源分类:Python库 所属语言:Python 使用前提:需要解压 资源全名:cloudtoken-0.1.43-py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    dingtalk-sdk-java.zip

    对于开发者来说,阅读taobao-sdk-java-auto_1479188381469-20220617-source.jar中的源代码,可以帮助理解钉钉API的实现逻辑,提高代码调试和问题排查能力。例如,可以学习如何封装HTTP请求,处理JSON数据,以及异常...

Global site tag (gtag.js) - Google Analytics