【原文地址】
http://news.bangkaow.com/news/20120405/343715.html
JSP、Struts避免Form重复提交的几种方案
1 javascript ,设置一个变量,只允许提交一次。
2 还是javascript,将提交按钮或者image置为disable
onsubmit=“getElById(‘submitInput’).disabled = true; return true;”》
3 利用struts的同步令牌机制
利用同步令牌(Token)机制来解决Web应用中重复提交的问题,Struts也给出了一个参考实现。
基本原理:
服务器端在处理到达的请求之前,会将请求中包含的令牌值与保存在当前用户会话中的令牌值进行比较,看是否匹配。在处理完该请求后,且在答复发送给客户端之前,将会产生一个新的令牌,该令牌除传给客户端以外,也会将用户会话中保存的旧的令牌进行替换。这样如果用户回退到刚才的提交页面并再次提交的话,客户端传过来的令牌就和服务器端的令牌不一致,从而有效地防止了重复提交的发生。
if (isTokenValid(request, true)) {
// your code here
return mapping.findForward(“success”);
} else {
saveToken(request);
return mapping.findForward(“submitagain”);
}
Struts根据用户会话ID和当前系统时间来生成一个唯一(对于每个会话)令牌的,具体实现可以参考TokenProcessor类中的generateToken()方法。
1. //验证事务控制令牌,会自动根据session中标识生成一个隐含input代表令牌,防止两次提交
2. 在action中:
// // value=“6aa35341f25184fd996c4c918255c3ae”》
if (!isTokenValid(request))
errors.add(ActionErrors.GLOBAL_ERROR,
new ActionError(“error.transaction.token”));
resetToken(request); //删除session中的令牌
3. action有这样的一个方法生成令牌
protected String generateToken(HttpServletRequest request) {
HttpSession session = request.getSession();
try {
byte id[] = session.getId().getBytes();
byte now[] =
new Long(System.currentTimeMillis()).toString().getBytes();
MessageDigest md = MessageDigest.getInstance(“MD5”);
md.update(id);
md.update(now);
return (toHex(md.digest()));
} catch (IllegalStateException e) {
return (null);
} catch (NoSuchAlgorithmException e) {
return (null);
}
}
在更新的时候防止按钮重复点击,主要是用Session来做判断
在JSP/Servlet中可以
JSP页面
SynchroToken.java
package com.lims.util;
import org.apache.struts.util.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
import org.apache.struts.action.*;
/**
*
Title: SynchroToken
*
Description:
*
Copyright: Copyright (c) 2004
*
Company: NetStar
* @author Jstar
* @version 1.0
* Created in 2004/04/21
*/
public class SynchroToken{
public final static java.lang.String TOKEN_NAME = “_token”;
public static boolean checkToken (HttpServletRequest request){
boolean isEqual = false;
HttpSession session = request.getSession ();
String formToken = request.getParameter (TOKEN_NAME);
String sessionToken = (String)session.getAttribute (TOKEN_NAME);
System.out.println (“formToken: ” + formToken + “ sessionToken: ” +
sessionToken);
if (formToken != null && sessionToken == null){
session.setAttribute (TOKEN_NAME, formToken);
isEqual = true;
}
return isEqual;
}
/**
* Insert the method‘s description here.
* Creation date: (4/19/2004 3:23:25 PM)
* @return java.lang.String
* @param request javax.servlet.http.HttpServletRequest
*/
public static String getToken (HttpServletRequest request){
String token = “” + System.currentTimeMillis ();
HttpSession session = request.getSession ();
if (session != null){
session.removeAttribute (TOKEN_NAME);
}
return token;z
}
/**
* Insert the method’s description here.
* Creation date: (4/19/2004 3:24:10 PM)
* @return java.lang.String
*/
final static java.lang.String getTOKEN_NAME (){
return TOKEN_NAME;
}
分享到:
相关推荐
下面详细介绍几种常用的防止重复提交的方法: ##### 方法1:使用HTTP头部控制 可以在JSP页面的`<head>`部分加入以下代码,通过设置HTTP头部来禁止浏览器缓存当前页面: ```html , must-revalidate"> , 26 Feb 1997...
Struts2提供了几种策略来防止表单的重复提交,确保请求的唯一性和事务的一致性。 一、令牌(Token)机制 Struts2的Token插件是防止重复提交的一种常见方法。这里的"Strut2Token"很可能是指这个插件的应用。它的...
【标题】:“jsp+struts小项目-1”是一个基于Struts1.2框架和JSP技术构建的小型Web应用程序示例。这个项目旨在帮助学习者掌握如何将这两种技术结合,实现动态网页和业务逻辑控制。 【描述】:在“jsp+struts小项目-...
而JSP(JavaServer Pages)则是一种动态网页技术,用于生成动态内容。 在Struts1中,用户登录通常涉及以下几个关键组件: 1. **Action类**:这是Struts1的核心组件,负责处理用户请求。在用户登录场景下,会有一个...
在Struts1中,ActionForm类需要有一个对应的List字段来接收这些值,这样在提交表单时,Struts1的默认Binding机制会自动将这些值绑定到List中。 4. **配置文件**: 配置文件(struts-config.xml)需要添加相应的...
解决这个问题有几种策略: 1. **自定义类型转换器**:可以通过继承`org.apache.struts.action.ActionForm`并重写`propertySetter`方法,或者创建一个实现了`TypeConverter`接口的类,覆盖默认的日期转换逻辑。这样...
【标题】"jsp上传下载文件源代码,通过struts.xml控制在100M以内"涉及的核心技术主要包括JSP(JavaServer Pages)、Struts框架以及文件上传与下载的处理。Struts是Apache软件基金会的一个开源项目,它为Java Web应用...
我们可以通过使用Struts2的标签库(例如`s:property`、`s:form`等)来简化JSP页面的编写,这些标签能直接与Action中的属性进行交互,从而减少代码量并提高可维护性。 在课程设计中,网上书店可能包括以下几个主要...
【标题】"JSP-servlet-struts-sqlserver开发的网上购物商场"揭示了这个项目是基于Java技术栈,利用JSP(JavaServer Pages)、Servlet、Struts框架以及SQL Server数据库构建的一个网上商城系统。这样的系统设计允许...
整合Spring和Struts是Web开发中常见的需求,这两者都是Java Web开发的重要框架。Spring以其强大的依赖注入(DI)和面向切面编程(AOP)能力,以及对其他框架的良好集成,而Struts则是一个专注于MVC模式的轻量级框架...
Struts和JSP是两种广泛应用于Java Web开发的技术。Struts是一个基于MVC(Model-View-Controller)设计模式的框架,它简化了构建企业级Java Web应用程序的过程。JSP(JavaServer Pages)则是一种动态网页技术,允许...
通过阅读这份中文文档,开发者可以学习到如何设置Struts环境、配置Action和Form Bean、编写JSP页面、使用Struts标签、实现数据校验、处理异常、以及如何利用Struts提供的各种插件和功能来提升开发效率。同时,文档还...
这两种方式在处理用户导航和防止重复提交方面有所不同。 7. **国际化和本地化**:Struts框架支持多语言,可以在应用中添加资源文件(如message.properties或message_zh_CN.properties),以便根据用户的浏览器设置...
Struts2是一个非常流行的Java Web开发框架,它提供了一种优雅的方式来组织和控制MVC(模型-视图-控制器)应用程序。在处理表单提交时,为了防止重复提交或者跨站请求伪造(CSRF)攻击,Struts2引入了令牌机制。这个...
然而,如果要直接跳转到JSP,而无需经过Action,可以有以下几种方法: 1. **使用HTML的表单提交**:在HTML表单中,可以直接指定`action`属性为JSP的URL,例如`<form action="myjsp.jsp" method="post">`。这样,...
总的来说,Struts 1提供了一种结构化的MVC框架,使得开发者能够更好地组织和管理Web应用程序的代码。虽然现代Web开发中已经有更先进的框架,如Spring MVC,但理解Struts 1的基础知识仍有助于理解Web开发的历史和演变...
Struts是Java Web开发中的一款经典MVC框架,它为开发者提供了一种组织应用程序结构、控制业务逻辑和处理用户输入的方式。在这个特定的场景中,我们关注的是如何使用Struts来实现动态单选按钮。在Web应用中,动态单选...
在Java Web开发中,Struts框架提供了一种组织应用程序结构和控制流程的方式,使得代码更易于管理和维护。你提到的“自己写的struts程序”很可能是一个简单的用户注册应用,这是学习Struts框架的常见实践项目。 首先...
它继承自 `org.apache.struts.action.DynaActionForm` 类,并且可以通过 `<form-property>` 标签在 `struts-config.xml` 文件中定义表单字段。 ```xml <form-bean name="xxForm" type="org.apache.struts.action....