`

Token防止页面重复提交

阅读更多
如果哪里有说的不对的地方,希望各位朋友指正

操作:
1.在以前的一个项目中,因为提交后,返回到维护页面,所以当提交后,并不后退,而是一直刷新,那么其实它是在一直做第一次提交的操作
2.当返回到维护页面后查看源代码,为什么新生成的"32位随机码"在页面的隐藏域里已经变了,但提交的时候,还是输出第一次的"32位随机码"呢,因为隐藏域的码确实是变了,但提交的并不是你再一次点击的"提交按钮"动作,而是还是第一次提交的动作,所以刷新是在执行第一次提交的动作

注意:
1.token.jsp必须用html:form标签

记住一点,Struts在你每次访问Action的时候,都会产生一个令牌,保存在你的Session里面,如果你在Action里的函数里面,使用了saveToken(request);,那么这个令牌也会保存在这个Action所Forward到的jsp所生成的静态页面里。
如果你在你Action的方法里使用了isTokenValid,那么Struts会将你从你的request里面去获取这个令牌值,然后和Session里的令牌值做比较,如果两者相等,就不是重复提交,如果不相等,就是重复提交了。

当然你也可以在你的action所继承的父类里面做表单重复提交的控制,这样就可以不用在所有的子类里来分别再写防止重复提交的代码

index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>My JSP 'index.jsp' starting page</title>
</head>
  
  <body>
    <html:link action="token.do?method=token">Token</html:link>
  </body>
</html>

TokenAction.java


public class TokenAction extends DispatchAction {
	
	public ActionForward token(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) {
		TokenForm tokenForm = (TokenForm) form;
		//saveToken创建一个新令牌,如果没有调用此方法,那么页面不会生成隐藏标签
		this.saveToken(request);
		return mapping.findForward("token");
	}
	
	public ActionForward add(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) {
		TokenForm tokenForm = (TokenForm) form;
		//如果为假,则进行了重复提交 
		if(isTokenValid(request,true)){
			System.out.println("正常提交");
			this.resetToken(request);
		}else{
			System.out.println("重复提交");
			//重新生成令牌
			this.saveToken(request);
			return mapping.getInputForward();
		}
		return mapping.findForward("token");
	}
}


token.jsp
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean"%> 
<%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html"%>
 
<html> 
	<head>
		<title>JSP for TokenForm form</title>
	</head>
	<body>
		<html:form action="/token.do?method=add">
			查看源代码可以看到隐藏标签,隐藏域value值的"32位随机码<br>
			姓名: <html:password property="username"/><br/>
			密码 : <html:text property="password"/><br/>
			<html:submit/><html:cancel/>
		</html:form>
	</body>
</html>


struts-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd">

<struts-config>
  <data-sources />
  <form-beans >
    <form-bean name="tokenForm" type="com.dahai.struts.form.TokenForm" />

  </form-beans>

  <global-exceptions />
  <global-forwards />
  <action-mappings >
    <action
      attribute="tokenForm"
      input="/token.jsp"
      name="tokenForm"
      parameter="method"
      path="/token"
      scope="request"
      type="com.dahai.struts.action.TokenAction" >
      <forward name="token" path="/token.jsp"/>
      </action>
  </action-mappings>

  <message-resources parameter="com.dahai.struts.ApplicationResources" />
</struts-config>


重点就两步:
1.在要跳转到页面的类里那个方法里调用saveToken(HttpServletRequest request)方法
2.在页面的要调用类的添加方法里调用isTokenValid(HttpServletRequest request,boolean arg1)方法
分享到:
评论
2 楼 gongmingwind 2008-12-16  
isTokenValid 
1 楼 majie 2008-05-28  
已经放入自己的项目中,谢谢了,

相关推荐

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

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

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

    Token机制是一种常用的防止表单重复提交的技术方案。其基本思想是在用户提交表单时,服务器会生成一个唯一的Token并将其存储在客户端(如通过Cookie或隐藏字段),同时也会在服务器端存储一份。当用户提交表单时,...

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

    Token 方法是另一种防止页面刷新重复提交的方法。该方法的基本原理是,每次提交表单时,服务器生成一个唯一的 Token,并将其存储在 Session 中。当用户提交表单时,服务器会验证该 Token 是否正确,如果正确则允许...

    sturts2防止表单的重复提交 token

    4. **销毁Token**:无论表单处理成功还是失败,服务器都会从session中移除该Token,以防止后续的重复提交。 在实际应用中,我们可以通过Struts2的拦截器(Interceptor)实现这个机制。`...

    防止页面重复提交demo

    本示例"防止页面重复提交demo"将介绍一种结合前端控制与后台session存储随机token的方法来解决这个问题。 首先,我们要理解页面重复提交可能产生的原因。通常,用户在点击提交按钮后,由于网络延迟或刷新页面,可能...

    asp.net 页面防止重复提交

    在ASP.NET开发中,页面重复提交是一个常见的问题,它可能导致数据冗余或一致性错误。防止重复提交对于确保数据的准确性和应用的稳定性至关重要。本文将深入探讨如何在ASP.NET环境中解决这个问题。 首先,理解问题的...

    JavaEE Struts2利用tokenSession防止重复提交

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

    PHP使用token防止表单重复提交的方法

    1. 为了安全起见,除了使用 token 防止重复提交,还可以结合其他验证机制,如 CSRF(跨站请求伪造)防护。 2. 生成的 token 应该是一次性的,即每次提交后都需要更新 session 中的 token 值,防止用户回退页面后再次...

    Token验证表单重复提交

    通过以上步骤,我们就成功地在SSM框架中实现了基于Token的表单重复提交验证。这种方法能够有效地防止由于网络延迟或其他原因导致的多次提交,确保了数据的一致性和安全性。需要注意的是,实际应用中可能还需要考虑...

    springMVC中基于token防止表单重复提交方法

    SpringMVC中基于Token防止表单重复提交方法是指通过在SpringMVC配置文件中添加拦截器配置,来拦截页面请求和表单提交请求,以防止表单重复提交。下面是该方法的实现思路和实现方式: 实现思路: 1. 在SpringMVC...

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

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

    struts2_token控制刷新重复提交

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

    javascript方式防止表单重复提交

    这种方法可以防止因为页面刷新导致的重复提交。 3. **利用Ajax异步提交**:通过Ajax提交表单,可以在后台处理完数据后再更新页面状态,这样用户不会看到页面刷新,也就无法再次提交。在`success`回调中,可以重置...

    struts token机制解决表单重复提交

    Struts Token机制是一种防止表单重复提交的有效策略,尤其在处理关键操作时,如金融交易或数据修改,防止用户意外或恶意多次点击提交按钮导致的数据重复性问题。下面将详细介绍Struts Token的工作原理、实现方式及其...

    struts+token机制解决表单重复提交

    Struts是Java Web开发中的一款流行MVC框架,它简化了构建基于JSP的Web应用程序的过程。然而,Web应用在处理表单提交...通过对这些代码的学习和研究,开发者能够熟练地在自己的项目中应用Struts+Token防止表单重复提交。

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

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

    防止表单重复提交

    本篇文章将深入探讨如何防止表单重复提交,主要关注于基于Struts2框架的解决方案。 首先,理解表单重复提交的原因。用户在点击提交按钮后,如果网络延迟或用户误操作导致页面刷新或再次点击提交,就可能发生重复...

    Struts之Token解决表单那重复提交

    在Struts配置文件中,为需要防止重复提交的Action添加一个拦截器引用,如`token`或`token-session`。这两个拦截器都可以处理Token,但`token-session`更安全,因为它会将Token存储在会话中,而不仅仅是请求中。 2....

Global site tag (gtag.js) - Google Analytics