thinking

one platform thousands thinking

Token(令牌)的机制来解决重复提交

struts有自带的Token(令牌)的机制来解决重复提交(包括后退,刷新等).举例:

假设:假设有一个新增用户的填写表单页面,填写完后点击"提交"按钮完成数据库录入功能,要求不能重复提交(指类似刷新页面的情况).此时,需要有两个action(第一个action用来生成hidden的token值.第二个action用来校验token值,通过判断来决定是不是重复提交,不是则提交操作,否则提示错误)和至少一个页面(保存token值和填写用户信息的录入页面)来完成校验是否重复提交.此处有两个页面来完成.

为了方便,用户表只有两个字段用户名<username>和密码<password>:

具体逻辑如下:

index.jsp--链接--> PrepareAddUserAction.java--转发并生成token--> addUser.jsp--提交-->
AddUserAction.java--首先校验 '是否重复提交 ',是提示错误信息,不是,执行数据库操作.

部分相关代码(省略formbean的代码):
========index.jsp========
<html> <head> <title> 测试 </title> </head> <body>
    <a   href= " <%=request.getContextPath()%> /PrepareAddUserAction.java "> 新增用户 </a>
</body> </html>

=========PrepareAddUserAction.java=========
package   com.tseyimwah.struts.action;

import   javax.servlet.http.HttpServletRequest;
import   javax.servlet.http.HttpServletResponse;

import   org.apache.struts.action.Action;
import   org.apache.struts.action.ActionForm;
import   org.apache.struts.action.ActionForward;
import   org.apache.struts.action.ActionMapping;

public   class   PrepareAddUserAction   extends   Action   {
public   ActionForward   execute(
ActionMapping   mapping,
ActionForm   form,
HttpServletRequest   request,
HttpServletResponse   response)   throws   HibernateException   {
                                    .........//相关方法
                                    saveToken(request);     //在下一个页面addUser.jsp生成hidden类型的token值
return   mapping.findForward( "addUser ");//页面跳转
}
}

==========addUser.jsp=============
此处代码没有什么要求,含有form的普通struts页面,代码省略,里面的 "提交 "按纽给AddUserAction.java,即 <html:form     action= "/AddUserAction.do "   method= "post ">

============AddUserAction.java=====
package   com.tseyimwah.struts.action;

import   javax.servlet.http.HttpServletRequest;
import   javax.servlet.http.HttpServletResponse;

import   org.apache.struts.action.Action;
import   org.apache.struts.action.ActionForm;
import   org.apache.struts.action.ActionForward;
import   org.apache.struts.action.ActionMapping;

public   class   AddUserAction   extends   Action   {
public   ActionForward   execute(
ActionMapping   mapping,
ActionForm   form,
HttpServletRequest   request,
HttpServletResponse   response)   throws   HibernateException   {
         
      //判断token值,如果是重复提交跳转到错误页面则提示出错信息,否则执行相关的数据库操作
      if   (!isTokenValid(request)){
            request.setAttribute(GlobalKeys.MESSAGE_ID,   "不允许重复提交! ");//设置出错信息
            return   (mapping.findForward( "errorPage "));
      }   else
          resetToken(request);   //重新设置token值,可不用
      }
      ......
      ......//其他的相关方法,如设置相关属性值,调用相关的数据库操作等
      return   (mapping.findForward( "addUserSucess "));//新增用户成功的页面
}


这只是将相关的必要代码写出,根据需要可以改写相关的代码.

posted on 2009-02-18 15:39 lau 阅读(1209) 评论(0)  编辑  收藏 所属分类: J2EE


只有注册用户登录后才能发表评论。


网站导航: