Struts 防止重复表单提交的工具包

canca canca
2007-12-07 20:59
1
0

       今天,我位网友在烦这个东东。他说,怎样防止用户重复提交同一个表单呢?我跟他说用Token。过了一会儿,他说,用Token有点烦。

       由于,我的项目里都没有弄Token的。所以一直没有弄个工具包。呵呵。现在就让我们从烦琐的工作解脱出来吧!今晚我弄了个工具类。

Token.java

package org.canca.token.util;

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 Token extends Action {
 public boolean validatorToken(HttpServletRequest request,
   HttpServletResponse response) {
  // 判断token是否有效,如果为假证明有重复提交
  if (!isTokenValid(request)) {
   saveToken(request);
   return false;
  } else { // 当用户首次提交时返!isTokenValid()返回true
   resetToken(request);
   return true;
  }
 }
 
 public ActionForward execute(ActionMapping mapping, ActionForm form,
   HttpServletRequest request, HttpServletResponse response) {
  String page = request.getParameter("page");
  if(null != page){
   //创建一个新的令牌
   saveToken(request);
   return mapping.findForward(page);
  }
  return null;
 }
}

以上是个工具类,使用时要配Struts-config.xml文件。

  <action path="/token"
   type="org.canca.token.util.Token" />

好了,现在是使用的时候了。

要用到Token的表单不能单单用条链接跳到那个表单。需要经过Action转过去。请看我以下使用方法:

<a href="/工程名/token.do?page=regist">注册表单</a>

注意:regist需要在Struts-config.xml文件里做好配置。配置如下:

<global-forwards>
  <forward name="regist" path="/regist.jsp"></forward>
 </global-forwards>

接着在Action里的execute方法里只需要一条语句就可以做好判断。

  Token token = new Token();
  if (!token.validatorToken(request, response)) {
          return mapping.findForward("registed");
  }

///////////-----这里就写自己的逻辑代码了--------

 

呵呵,简单吧!!如果使用Spring的AOP效果更好!

发表评论