請求有效性處理,使用令牌可以有效的防止重複提交。
protected String generateToken(HttpServletRequest request)創建一個令牌.
protected boolean isTokenValid(HttpServletRequest request)檢查令牌是否有效
protected boolean isTokenValid(HttpServletRequest request,Booleanreset) 檢查令牌是否有效,並且重置令牌(如果reset 是true)
protected void resetToken(HttpServletRequest request)重置令牌
protected void saveToken(HttpServletRequest request) 添加令牌
基本原理:
服務器端在處理到達的請求之前,會將請求中包含的令牌值與保存在當前用戶會話中的令牌值進行比較,
看是否匹配。在處理完該請求後,且在答覆發送給客戶端之前,將會產生一個新的令牌,該令牌除傳給
客戶端以外,也會將用戶會話中保存的舊的令牌進行替換。這樣如果用戶回退到剛纔的提交頁面並再次
提交的話,客戶端傳過來的令牌就和服務器端的令牌不一致,從而有效地防止了重複提交的發生。
實例:
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;
public class ToAddAction extends Action {
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控件
<</span>div><</span>input type="hidden" name="org.apache.struts.taglib.html.TOKEN" value="b030d9188a218097211d9061907cde5d"></</span>div>
那麼恭喜你,Token生效拉,注意,跳轉到的頁面裏面,表單指可以用Struts標籤來生成,不可以用HTML來生成,不然Token是無效的。
使用Token的第一步完成,第二步,在提交的Action中驗證Token是否符合,代碼如下:
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;
public class AddAction extends Action {
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();
}
}