package com.struts.action;
import javax.servlet.http.*;
import org.apache.struts.action.*;
import org.apache.struts.validator.DynaValidatorForm;
import com.struts.model.ProcessBean;
public class AddMemberAction extends Action {
public ActionForward execute(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response) {
if (isCancelled(request)){
//如果点击了“取消”按钮就直接返回首页
return mapping.findForward("index");
}else{
ActionErrors errors = new ActionErrors();
if (!isTokenValid(request)){ //如果是重复提交
//在当前会话中放置新的令牌
//*********************************
saveToken(request);
//*********************************
//如果是重复提交就携带错误消息直接返回会员注册页面
errors.add("tokenerrors",new ActionError("login.token"));
saveErrors(request,errors);
return mapping.getInputForward();
}else{ //如果不是重复提交
//将令牌属性从当前会话中删除
resetToken(request);
//取得动态表单对象
DynaValidatorForm addMemberForm = (DynaValidatorForm) form;
//调用模型组件ProcessBean来处理表单数据
ProcessBean processor = new ProcessBean(getDataSource(request));
processor.addMember(addMemberForm);
//注册会员数据入库后返回
return mapping.findForward("index");
}
}
}
}
*********************************************
大家都知道Token机制是避免重复提交的机制.上面的程序我试验过,总结如下:
1.填写了一次资料,提交之后返回主页面.
2.按后退返回提交页面,补回相关信息,按确定提交,提示错误信息.
3.但是再按一次确定按钮,却提交上了.
鄙人看了token教程之后,还是对saveToken和resetToken两个方法不大了解,请各位解释完上面的程序之后,顺便解释解释.
补充一下:上面的唯一的"saveToken"方法,如果改变成"resetToken"方法之后,就不会出现我上面的说法了.
------解决方案--------------------
顶出来~