请求有效性处理,使用令牌可以有效的防止重复提交。
protected String generateToken(HttpServletRequest request) 创建一个令牌.
protected boolean isTokenValid(HttpServletRequest request) 检查令牌是否有效
protected boolean isTokenValid(HttpServletRequest request,Boolean reset) 检查令牌是否有效,并且重置令牌(如果reset 是true)
protected void resetToken(HttpServletRequest request) 重置令牌
protected void saveToken(HttpServletRequest request) 添加令牌
基本原理:
服务器端在处理到达的请求之前,会将请求中包含的令牌值与保存在当前用户会话中的令牌值进行比较,
看是否匹配。在处理完该请求后,且在答复发送给客户端之前,将会产生一个新的令牌,该令牌除传给
客户端以外,也会将用户会话中保存的旧的令牌进行替换。这样如果用户回退到刚才的提交页面并再次
提交的话,客户端传过来的令牌就和服务器端的令牌不一致,从而有效地防止了重复提交的发生。
实例:
Code
/*
* Generated by MyEclipse Struts
* Template path: templates/java/JavaClass.vtl
*/
package com.yourcompany.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;
/**
* MyEclipse Struts
* Creation date: 08-01-2008
*
* XDoclet definition:
* @struts.action validate="true"
* @struts.action-forward name="add" path="/add.jsp"
*/
public class ToAddAction extends Action {
/*
* Generated Methods
*/
/**
* Method execute
* @param mapping
* @param form
* @param request
* @param response
* @return ActionForward
*/
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
// TODO Auto-generated method stub
saveToken(request);
return mapping.findForward("add");
}
}
这个Action主要作用就是在跳转的页面上加入Token,只有加入Token才能实现Token的验证。执行完这个Action后,跳转到的页面会出现类似如下的一个hidden控件
Code
<div><input type="hidden" name="org.apache.struts.taglib.html.TOKEN" value="b030d9188a218097211d9061907cde5d"></div>
那么恭喜你,Token生效拉,注意,跳转到的页面里面,表单指可以用Struts标签来生成,不可以用HTML来生成,不然Token是无效的。
使用Token的第一步完成,第二步,在提交的Action中验证Token是否符合,代码如下:
Code
/*
* Generated by MyEclipse Struts
* Template path: templates/java/JavaClass.vtl
*/
package com.yourcompany.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;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;
import com.lc.sqlhelp.Access;
import com.yourcompany.struts.form.AddForm;
/**
* MyEclipse Struts Creation date: 08-01-2008
*
* XDoclet definition:
*
* @struts.action path="/add" name="addForm" input="/form/add.jsp"
* scope="request" validate="true"
* @struts.action-forward name="add_suc" path="/add_suc.jsp"
* @struts.action-forward name="add_fail" path="/add_fail.jsp"
*/
public class AddAction extends Action {
/*
* Generated Methods
*/
/**
* Method execute
*
* @param mapping
* @param form
* @param request
* @param response
* @return ActionForward
*/
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
AddForm af = (AddForm) form;
if (isTokenValid(request, true))//验证Token是否符合要求
{
String sql = "insert into user (username,password) values('"
+ af.getUsername() + "','" + af.getPassword() + "')";
System.out.println(sql);
Access sh = new Access();
sh.loadMyDriver();
sh.setMyConnection();
sh.createMyStatement();
sh.executeMyUpdata(sql);
sh.closeMyStatement();
sh.closeMyConnection();
return mapping.findForward("add_suc");
}
return mapping.getInputForward();
}
}
这样就完成了防止表单重复提交的功能。
实例源码下载