`
wsmajunfeng
  • 浏览: 498122 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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

 
阅读更多
写道
/*
* 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;
}
}
 

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

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

看代码。

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

 

怎么使用?

在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://hi.baidu.com/bobylou/blog/item/a9519e3d3329bf02bba167ea.html

分享到:
评论

相关推荐

    防止刷新后退重复提交

    针对这个问题,我们可以采取多种策略来防止刷新后退时的重复提交。以下是针对"防止刷新后退重复提交"这一主题的详细知识点: 1. **令牌(Token)技术**: 服务器在处理表单提交前,生成一个唯一的令牌(Token),...

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

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

    ASP.NET中防止刷新页面造成表单重复提交

    ### ASP.NET中防止刷新页面造成表单重复提交 在Web应用程序开发中,特别是在使用ASP.NET进行网站构建时,一个常见的问题是表单重复提交。这通常发生在用户通过按下浏览器的F5键来刷新页面的情况下,此时之前的表单...

    防止页面刷新重复提交的方法.

    防止页面刷新重复提交是 Web 开发中非常重要的问题,为了防止这种问题,我们可以使用验证码方法、Token 方法、AJAX 方法等。验证码方法是最简单、最effective 的方法,Token 方法可以防止 CSRF 攻击,AJAX 方法可以...

    sturts2防止表单的重复提交 token

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

    自定义注解解决API接口幂等设计防止表单重复提交(生成token存放到redis中)

    为了解决这一问题,我们可以采用自定义注解结合Redis来实现一个防止表单重复提交的解决方案。 首先,让我们理解自定义注解的核心思想。注解是一种元数据,它提供了在代码中添加信息的方式,这些信息可以被编译器或...

    J2EE框架-重复提交、重复刷新、防止后退的问题以及处理方式

    在J2EE框架中,开发过程中常常会遇到一些与用户交互相关的技术问题,如重复提交、重复刷新以及防止用户后退导致的数据不一致。这些问题在实际应用中可能会对系统的稳定性和数据完整性造成影响,因此需要采取相应的...

    防止用户刷新,重复提交数据

    在Web开发中,防止用户刷新页面而导致重复提交数据是一个重要的问题。这通常涉及到表单提交、支付确认等关键操作,确保这些操作仅执行一次是非常必要的。本资源提供了一个解决方案,通过使用“Token”机制来避免这种...

    防止页面的重复提交和刷新

    ### 防止页面的重复提交和刷新 #### 一、引言 在现代Web应用开发过程中,确保数据完整性与用户体验至关重要。其中,“防止页面的重复提交和刷新”这一问题尤为关键,它不仅关系到系统的稳定性,还直接影响用户体验...

    struts2_token控制刷新重复提交

    Token机制是一种防止重复提交的方法,它通过在客户端(通常是浏览器的session或者cookie)和服务器端存储一个唯一的令牌,确保每个请求是唯一的。当用户首次提交表单时,服务器会生成一个随机的令牌,并将其发送给...

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

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

    利用Token机制解决重复重复提交

    ### 利用Token机制解决重复提交问题 在Web应用开发中,防止表单的重复提交是一个常见的需求。本文将深入探讨如何通过Token机制来解决这一问题,并提供详细的实现步骤及原理解析。 #### 一、Token机制简介 Token...

    Token验证表单重复提交

    在Web应用中,表单重复提交是一个常见的问题,可能导致数据的不一致性。为了解决这个问题,我们可以使用Token机制。在SSM(Spring、SpringMVC、MyBatis)开发框架中,结合注解和拦截器,可以有效地实现表单重复提交...

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

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

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

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

    JavaEE Struts2利用tokenSession防止重复提交

    总结,Struts2的tokenSession机制是JavaEE Web开发中防止重复提交的有效手段,通过生成并校验token,确保每个请求的唯一性,从而保护了业务数据的完整性。在实际项目中,我们需要正确配置和使用这个机制,以提高应用...

    防重复提交代码

    通过上述方法,可以有效地防止因刷新等原因引起的重复提交问题,从而保障了数据的一致性和系统的稳定性。需要注意的是,虽然这种方法可以在一定程度上防止重复提交,但在实际应用中还需要结合其他手段,如前端...

    防止表单重复提交的方法(简单的token方式)

    防止表单重复提交的方法(简单的token方式),内附实现代码及实现思路。

    Asp.net刷新重复提交

    在ASP.NET web应用程序中,"刷新重复提交"是一个常见的问题,它发生在用户点击浏览器的刷新按钮或者使用前进/后退导航时。这可能导致数据的不一致性和错误,因为服务器可能会收到相同请求的多次处理,而这些请求原本...

    java token验证和注解方式放行

    Token通常用于验证用户身份,防止未授权的访问。下面我们将深入探讨这两个主题。 首先,Token验证是一种常见的身份验证机制,它允许用户通过提供一个唯一的、不可篡改的字符串(Token)来证明他们的身份。这种机制...

Global site tag (gtag.js) - Google Analytics