今天有朋友问到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();
这样去生成的
<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();
这样去生成的