struts2令牌,防止重复提交

struts2的令牌,可以用来防止重复提交,其原理是在提交jsp页面中,写入一个隐藏域name="token",然后在action中定义一个变量token并get、set。在服务器端避免表单重复提交,通常是采用同步令牌的方式实现,其基本原理是:

(1)用户访问包含表单的页面,服务器端在这次会话中,创建一个Session对象,并产生一个令牌值,将这个令牌值作为隐藏输入域(<input>元素的type属性为hidden)的值,随表单一起发送到客户端,同时将令牌值保存到Session中。

(2)用户提交页面,服务器端首先判断请求参数中的令牌值和Session中保存的令牌值是否相等,如果相等,则清除Session中的令牌值,然后执行数据处理操作。如果不相等,则提示用户已经提交过了表单,同时产生一个新的令牌值,保存到Session中。当用户重新访问提交数据页面中,将新产生的令牌值作为隐藏输入域的值。

假定提交前该令牌号为LY7DPVNMJ872N6EOJ1OTO8URRON7P0NX,如果保存后返回到jsp页面令牌号会重新生成并保存到session中。那么你通过刷新或后退再次保存,提交到后台的令牌号依然是上次的LY7DPVNMJ872N6EOJ1OTO8URRON7P0NX。这样,这次保存提交的号与session中的号就不一样了。那么系统就可以判断出你是重复提交,然后跳转到相应的提示页面!

下面是java代码:

package com.test;  
  1.   
  2. import com.opensymphony.xwork2.ActionSupport;  
  3.   
  4. public class Test extends ActionSupport {                   
  5.    private String token;  //令牌     
  6.     public String getToken() {
          return token;
       }
      public void setToken(String token) {
         this.token = token;
      }
        
  7.   。。
  8.   。。
  9.   。。          
  10. }       

struts.xml文件代码:

<?xml version="1.0" encoding="UTF-8"?>  
  1. <!DOCTYPE struts PUBLIC  
  2.     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  
  3.     "http://struts.apache.org/dtds/struts-2.0.dtd">  
  4. <struts>        
  1.     <!-- action 设置-->  
  2.   <package name="test" extends="struts-default" namespace="/testToken">           
  3.                 <action name="test" class="com.test.Test">           
  4.                <result name="invalid.token">/error.jsp</result> <!当重复提交时,转到error.jsp页面>                                                          
  5.                         <result>/test.jsp</result>           
  6.           
  7.                      <interceptor-ref name="defaultStack" />           
  8.                      <interceptor-ref name="token" />           
  9.           
  10.                 </action>           
  11.     </package>           
  12.   
  13.   
  14. </struts>  

test.jsp代码

<%@ page language="java" contentType="text/html; charset=utf-8"  
  1.     pageEncoding="utf-8"%>  
  2. <%@ taglib prefix="s" uri="/struts-tags"%>  
  3.   
  4. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  5. <html xmlns="http://www.w3.org/1999/xhtml">  
  6.     <head>  
  7.         <title>struts2 test token</title>  
  8.         <s:head />  
  9.     </head>  
  10.     <body>  
  11.         <s:actionerror/>  
  12.      <s:form action="test" namespace="/testToken">     
  13.            <s:textfield name="message" label="请输入您的信息"/>  
  14.            <s:token name="token"/>  
  15.            <s:submit value="确定" />  
  16.        </s:form>  
  17.   
  18.     </body>  
  19. </html>  

error.jsp代码

<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>  
  1. <%@ taglib prefix="s" uri="/struts-tags" %>  
  2. <html>  
  3. <body>  
  4. <s:actionerror/>  
  5.     不能重复提交表单!  
  6. </body>  
  7. </html>  
原文地址:https://www.cnblogs.com/kaka-bing/p/3178077.html