Struts 防止重复表单提交的工具包
今天,我位网友在烦这个东东。他说,怎样防止用户重复提交同一个表单呢?我跟他说用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效果更好!