請求有效性處理,使用令牌可以有效的防止重復提交。
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();
}
}
這樣就完成了防止表單重復提交的功能。
實例源碼下載
文章來源:
http://www.cnblogs.com/xiaoao808/archive/2008/08/01/1258067.html
posted on 2008-08-01 12:07
破名超難起 閱讀(111)
評論(0) 編輯 收藏