日期:2014-05-17  浏览次数:20639 次

Struts 的 Token 问题
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"方法之后,就不会出现我上面的说法了.

------解决方案--------------------
顶出来~