`

在Struts利用同步令牌(Token)来解决表单被重复提交的问题

    博客分类:
  • Java
阅读更多
如果表单被重复的提交,第二次提交可能产生错误,用户不断的刷新页面,调用对应的Action,不进行控制,如注册页面不断的和数据库交互,对于服务器端负载太大。
在此利用Struts的同步令牌机制来解决问题
主要是利用了Action类中的一些方法
  (1)saveToken(HttpServletRequest request)
    生成一个新的令牌值并保存在session中(每次生成的都不一样)
  (2)isTokenValid(HttpServletRequest request)
    判断当前session和请求参数中的令牌值是否匹配,若匹配返回true,若不匹配返回false
  (3)resetToken(HttpServletRequest request)
    将session中的令牌值删除

下面以一个简单的注册的例子来介绍
现在有一个写好的register.jsp的登录页面,现在我们对它来做一下修改,使它能够防止被重复的提交。
1.添加一个过滤器,使得在执行register.jsp之前先执行过滤器
    public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
// TODO Auto-generated method stub
HttpServletRequest request =
(HttpServletRequest)arg0;
//跳转到PreRegisterAction
request.getRequestDispatcher
("/token/preRegister.do")
.forward(arg0, arg1);
}
   过滤器执行preRegister
2.添加Action,PreRegisterAction.java,这个action很简单,就是生成一个新的令牌放在session中
public ActionForward execute(ActionMapping mapping, ActionForm form,
   HttpServletRequest request, HttpServletResponse response) {
//生成一个新的令牌值放置在session中
super.saveToken(request);
return new ActionForward
("/token/register.jsp");
}
3.在register.jsp页面上的form改为<html:form action="/token/sufRegister">
4.添加Action,SufRegisterAction.java
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
         RegisterForm registerForm = (RegisterForm) form;
//判断session和请求参数中的令牌值是否匹配
if(!super.isTokenValid(request)){//不匹配
//若不匹配说明重复提交表单了,那么在
//页面上要提示一下用户
ActionMessages errors =
new ActionMessages();
ActionMessage message =
new ActionMessage("error.token");
errors.add("token", message);
super.saveErrors(request, errors);
return new ActionForward
(mapping.getInput());
}else{//匹配
//若匹配说明用户是第一次提交表单
//构造一个Customer对象,并调用模型层中
//的业务接口方法register()进行用户注册

System.out.println("注册成功...");
//若注册成功要从session中删除令牌值
super.resetToken(request);
return new ActionForward
("/token/login.jsp");
}

}


这样就完成了利用同步令牌来防止网页重复提交的问题。



分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics