今天有朋友問到struts2中的token演算法,特意複習了下,看了下代碼,其實是這樣的,摘錄如下:
<s:token>是Struts2中為了防止表單重複提交的標籤,這個標籤的實作類別是org.apache.struts2.views.jsp.ui.TokenTag,這個類是關鍵的父類是org.apache.struts2.views.jsp.ComponentTagSupport。
第一、
TokenTag ComponentTagSupport.doStartTag 將控制項對象化
TokenTag ComponentTagSupport.doEndTag component.end 調用component(Token)
Token 繼承自org.apache.struts2.components.UIBean,因此首先調用UIBean.end方法,在UIBean.end方法中最後一句調用定義為protected的方法evaluateExtraParams,這個方法是提供給UIBean的子類擴充使用的,在Token的evaluateExtraParams方法中
String token = buildToken(tokenName);
其中buildToken方法實際上調用的是 TokenHelper.setToken方法,在setToken方法中值得注意的是兩點,
1 generateGUID()方法,此方法是產生Token值得演算法所在
2 session.put(tokenName, token)可以看到此處將產生的值儲存在session中,等待以後比對。
第二、
到此<s:token>已經完成了他的任務,之後的比對來判斷是否為重複提交,Struts2是通過interceptor來完成的TokenInterceptor,調用TokenHelper.validToken方法,此方法從Parameters中取出token值來和session裡比較,如果不一樣return false
其中代碼中的產生TOKEN演算法,在TokenHelper代碼中,
return (new BigInteger(165, RANDOM)).toString(36).toUpperCase();
這樣去產生的