简单的防止重复提交,没用拦截器配置
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib uri="/struts-tags" prefix="s"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <form id="form1" name="form1" action="token_doToken.do" method="post"> <s:token></s:token> <s:submit value="token验证"></s:submit> </form> </body> </html>
package com.ys.action.token; import java.util.Map; import org.apache.struts2.util.TokenHelper; import com.opensymphony.xwork2.ActionContext; import com.ys.action.BaseAction; public class TokenAction extends BaseAction { /** * */ private static final long serialVersionUID = 1L; public String toToken(){ return "tokenIndex"; } public String doToken(){ System.out.println(TokenHelper.getTokenName()+"_"+TokenHelper.generateGUID());//获得helper类的token名字和id //获得session里的token Map session = ActionContext.getContext().getSession(); String sessionToken = (String) session.get("struts.token"); System.out.println("sessionToken:——"+sessionToken); //获得页面的token Map params = ActionContext.getContext().getParameters(); String[] tokens = (String[]) params.get("struts.token"); String token = tokens[0]; System.out.println("token:——"+token); if(TokenHelper.validToken()){ return "tokenSuccess";//成功 } return "tokenFail";//失败了 } }
进行验证
在action里输出:
struts.token_71328NMVIZRB07IJA6VX0FUOJMDR4R0P
sessionToken:——NDMXQ4MJC4GI44KXKOJOVDJJVZI068Q0
token:——NDMXQ4MJC4GI44KXKOJOVDJJVZI068Q0
在页面刷新之后
action里获得的则是:
struts.token_IPHC9VN05S6RX13PMSOGGXG9OK0Q9YRF
sessionToken:——null
token:——NDMXQ4MJC4GI44KXKOJOVDJJVZI068Q0
TokenHelper.java源码
/** * $Id: TokenHelper.java 781798 2009-06-04 17:08:35Z wesw $ * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.struts2.util; import java.math.BigInteger; import java.util.Map; import java.util.Random; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.util.LocalizedTextUtil; import com.opensymphony.xwork2.util.logging.Logger; import com.opensymphony.xwork2.util.logging.LoggerFactory; /*** * TokenHelper * */ public class TokenHelper { /*** * The default name to map the token value */ public static final String DEFAULT_TOKEN_NAME = "struts.token"; /*** * The name of the field which will hold the token name */ public static final String TOKEN_NAME_FIELD = "struts.token.name"; private static final Logger LOG = LoggerFactory.getLogger(TokenHelper.class); private static final Random RANDOM = new Random(); /*** * Sets a transaction token into the session using the default token name. * * @return the token string */ public static String setToken() { return setToken(DEFAULT_TOKEN_NAME); } /*** * Sets a transaction token into the session using the provided token name. * * @param tokenName the name to store into the session with the token as the value * @return the token string */ public static String setToken(String tokenName) { Map session = ActionContext.getContext().getSession(); String token = generateGUID(); try { session.put(tokenName, token); } catch(IllegalStateException e) { // WW-1182 explain to user what the problem is String msg = "Error creating HttpSession due response is commited to client. You can use the CreateSessionInterceptor or create the HttpSession from your action before the result is rendered to the client: " + e.getMessage(); LOG.error(msg, e); throw new IllegalArgumentException(msg); } return token; } /*** * Gets a transaction token into the session using the default token name. * * @return token */ public static String getToken() { return getToken(DEFAULT_TOKEN_NAME); } /*** * Gets the Token value from the params in the ServletActionContext using the given name * * @param tokenName the name of the parameter which holds the token value * @return the token String or null, if the token could not be found */ public static String getToken(String tokenName) { if (tokenName == null ) { return null; } Map params = ActionContext.getContext().getParameters(); String[] tokens = (String[]) params.get(tokenName); String token; if ((tokens == null) || (tokens.length < 1)) { LOG.warn("Could not find token mapped to token name " + tokenName); return null; } token = tokens[0]; return token; } /*** * Gets the token name from the Parameters in the ServletActionContext * * @return the token name found in the params, or null if it could not be found */ public static String getTokenName() { Map params = ActionContext.getContext().getParameters(); if (!params.containsKey(TOKEN_NAME_FIELD)) { LOG.warn("Could not find token name in params."); return null; } String[] tokenNames = (String[]) params.get(TOKEN_NAME_FIELD); String tokenName; if ((tokenNames == null) || (tokenNames.length < 1)) { LOG.warn("Got a null or empty token name."); return null; } tokenName = tokenNames[0]; return tokenName; } /*** * Checks for a valid transaction token in the current request params. If a valid token is found, it is * removed so the it is not valid again. * * @return false if there was no token set into the params (check by looking for {@link #TOKEN_NAME_FIELD}), true if a valid token is found */ public static boolean validToken() { String tokenName = getTokenName(); if (tokenName == null) { if (LOG.isDebugEnabled()) LOG.debug("no token name found -> Invalid token "); return false; } String token = getToken(tokenName); if (token == null) { if (LOG.isDebugEnabled()) LOG.debug("no token found for token name "+tokenName+" -> Invalid token "); return false; } Map session = ActionContext.getContext().getSession(); String sessionToken = (String) session.get(tokenName); if (!token.equals(sessionToken)) { LOG.warn(LocalizedTextUtil.findText(TokenHelper.class, "struts.internal.invalid.token", ActionContext.getContext().getLocale(), "Form token {0} does not match the session token {1}.", new Object[]{ token, sessionToken })); return false; } // remove the token so it won't be used again session.remove(tokenName); return true; } public static String generateGUID() { return new BigInteger(165, RANDOM).toString(36).toUpperCase(); } }
相关推荐
4. **销毁Token**:无论表单处理成功还是失败,服务器都会从session中移除该Token,以防止后续的重复提交。 在实际应用中,我们可以通过Struts2的拦截器(Interceptor)实现这个机制。`...
PHP表单加入Token防止重复提交的方法分析的核心在于理解Token(令牌)的使用机制,以及它如何有效地防止表单的重复提交问题。Token在Web开发中指的是一个由服务器生成的随机字符串,它具有一定的不可预测性和唯一性...
### 解决Struts中通过Token防止重复提交的问题 在Web应用程序开发中,特别是基于MVC架构的框架如Apache Struts中,确保用户操作的安全性是非常重要的。其中一项常见且重要的安全措施是防止表单的重复提交。本文将...
Token机制是一种常见的防止重复提交的方法,其核心思想是为每一次表单提交生成一个唯一的Token值,并将这个Token值存储在客户端(通常是在表单中作为一个隐藏字段),同时也在服务器端记录该Token值。当表单被提交时...
一种防止重复提交的方法是使用“请求令牌”(Request Token)。在页面加载时,服务器生成一个唯一的令牌,并将其存储在隐藏表单字段或Cookie中。在用户提交表单时,服务器会检查令牌是否有效且未使用过。如果令牌已...
总的来说,"Token-SpringMVC"是Spring MVC框架中防止重复提交的一种实用策略,它通过令牌验证确保了请求的唯一性,从而保护了系统的数据一致性。在实际开发中,我们需要根据项目需求和安全级别来选择合适的防止重复...
struts2防止表单重复提交,利用struts的拦截器tokenSession,轻轻松松解决表单重复提交的问题。 附件为源代码,后台延迟了3秒,可直接在web服务器下部署运行,输入用户名和密码后,多点几次提交按钮,然后看控制台...
1. 为了安全起见,除了使用 token 防止重复提交,还可以结合其他验证机制,如 CSRF(跨站请求伪造)防护。 2. 生成的 token 应该是一次性的,即每次提交后都需要更新 session 中的 token 值,防止用户回退页面后再次...
总结,Struts2的tokenSession机制是JavaEE Web开发中防止重复提交的有效手段,通过生成并校验token,确保每个请求的唯一性,从而保护了业务数据的完整性。在实际项目中,我们需要正确配置和使用这个机制,以提高应用...
Token机制是一种常用的防止表单重复提交的技术方案。其基本思想是在用户提交表单时,服务器会生成一个唯一的Token并将其存储在客户端(如通过Cookie或隐藏字段),同时也会在服务器端存储一份。当用户提交表单时,...
该方法通过将 token 保存到 session 中,并在提交时检查 token 是否相同来防止重复提交。 3. 定义 annotation 和拦截器 定义 annotation 和拦截器是实现防止重复提交的关键步骤。annotation 用于标注需要防止重复...
防止表单重复提交的方法(简单的token方式),内附实现代码及实现思路。
总的来说,Struts2的`token`拦截器是防止重复提交的有效解决方案,通过结合合理的拦截器配置和跳转策略,可以确保应用程序的稳定性和数据一致性。在实际开发中,还需要考虑其他因素,如异常处理、用户体验优化等,以...
1. **配置Action**: 在Struts配置文件(如struts.xml)中,为需要防止重复提交的Action添加`token`拦截器。 ```xml <interceptor-ref name="token"/> <result name="success">/success.jsp ...
为了解决这一问题,我们可以采用自定义注解结合Redis来实现一个防止表单重复提交的解决方案。 首先,让我们理解自定义注解的核心思想。注解是一种元数据,它提供了在代码中添加信息的方式,这些信息可以被编译器或...
通过以上步骤,我们就成功地在SSM框架中实现了基于Token的表单重复提交验证。这种方法能够有效地防止由于网络延迟或其他原因导致的多次提交,确保了数据的一致性和安全性。需要注意的是,实际应用中可能还需要考虑...
然而,有时候框架自带的功能可能并不能完全满足特定的需求,例如在防止重复提交这一问题上。防止重复提交是为了避免用户因为网络延迟或误操作导致的同一请求多次发送,从而对数据库造成不必要的影响。在本案例中,...
在IT行业中,尤其是在Web开发领域,防止用户多次重复提交数据是一项重要的任务,这可以避免数据库出现冗余数据,保持系统稳定。"修改禁止多次重复提交"这个话题涉及到前端交互、后端处理以及数据库操作等多个层面。...
Token 标签的使用可以防止重复提交。添加以下代码: ```jsp ... <s:token></s:token> ... ``` Step 3: 配置 Action 使用 Token 拦截器 在 Struts2 中,可以在 struts.xml 文件中配置 Action 使用 Token ...