[Struts]Token 使用及原理
?
Struts Token?使用
?
1,先在一個Action中,調用saveToken(HttpServletRequest request)方法。然后轉向帶有表單的JSP頁面。
?
2,在JSP頁面提交表單給一個Action,再這個Action中進行是否為重復提交的判斷。
?
if?(isTokenValid(request,?true))?{?????????????????????//?未重復提交時,正確的時候應該做的事情
??????????????????return?mapping.findForward("success");
??????????????}?else?{
????????????//?重復提交時,需要做的事情
??????????????????saveToken(request);
??????????????????return?mapping.findForward("error");
??????????????}
?
?
Struts Token?機制:
?
1,??由第一個Action調用saveToken(HttpServletRequest request),這個方法內部實現如下:
?
protected?void?saveToken(HttpServletRequest?request)?{????????token.saveToken(request);
}
?
?
????????token.saveToken(request);
???????這個方法的實現如下:
?
public?synchronized?void?saveToken(HttpServletRequest?request)?{?
????????HttpSession?session?=?request.getSession();
????????String?token?=?generateToken(request);
????????if?(token?!=?null)?{
????????????session.setAttribute(Globals.TRANSACTION_TOKEN_KEY,?token);
????????}
}
?
這個方法調用generateToken方法實現如下:
?
public?synchronized?void?saveToken(HttpServletRequest?request)?{?
????????HttpSession?session?=?request.getSession();
????????String?token?=?generateToken(request);
????????if?(token?!=?null)?{
????????????session.setAttribute(Globals.TRANSACTION_TOKEN_KEY,?token);
????????}
}
?
?
generateToken完畢后,將得到的唯一值setAttribute到session中。
?
session.setAttribute(Globals.TRANSACTION_TOKEN_KEY,?token);?
?
Globals.TRANSACTION_TOKEN_KEY的值是:” org.apache.struts.action.TOKEN”
?
?
然后跳轉到JSP頁面。
?
?
2,??JSP頁面的Struts自定義標簽?<html:form>的標簽類:org.apache.struts.taglib.html. FormTag
?
這個類的doStartTag()方法會調用本類的renderToken()方法。
?
protected?String?renderToken()?{????????StringBuffer?results?=?new?StringBuffer();
????????HttpSession?session?=?pageContext.getSession();
?
????????if?(session?!=?null)?{
????????????String?token?=
????????????????(String)?session.getAttribute(Globals.TRANSACTION_TOKEN_KEY);
????????????????
????????????if?(token?!=?null)?{
????????????????results.append("<input?type=\"hidden\"?name=\"");
????????????????results.append(Constants.TOKEN_KEY);
????????????????results.append("\"?value=\"");
????????????????results.append(token);
????????????????if?(this.isXhtml())?{
????????????????????results.append("\"?/>");
????????????????}?else?{
????????????????????results.append("\">");
????????????????}
????????????}
????????}
?
????????return?results.toString();
}
?
?
?
這樣子會生成類似于
?
<input?type="hidden"?name="org.apache.struts.taglib.html.TOKEN"??????????value="6aa35341f25184fd996c4c918255c3ae">
?
的隱藏標簽。
?
然后提交到一個Action中,在Action中用isTokenValid()方法進行比較session中” org.apache.struts.action.TOKEN”的這個key所對應的值和提交來的request中的” org.apache.struts.action.TOKEN”的這個value是否一致。
如果為true,那么證明可以提交。如果為false,證明已經重復,不允許提交。
轉載于:https://www.cnblogs.com/u0mo5/p/4170426.html
總結
以上是生活随笔為你收集整理的[Struts]Token 使用及原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Mac MacBook Pro的移动硬
- 下一篇: ultraEdit-32 PHP/HTM