struts框架token摘录笔记

来源:互联网 发布:月工资算法公式 编辑:程序博客网 时间:2024/06/04 18:08

令牌生成原理图


如果某个jsp页面中有token标签,那么无论是请求这个界面还是内部转发到这个界面,我们统一说成是“渲染界面”的时候,都会造成token id的产生或者更新。

    一定要搞清楚,这里是请求的jsp页面,此时可以产生令牌,但令牌不会起作用,因为它拦截的不是jsp,而是通过反射机制调用的方法。


令牌拦截原理图


令牌可以拦截的是Action中的方法。

     如果方法需要被拦截,会判断session中的token id和提交过来的token id是否相等。如果不相等,则直接跳转到预先配置好的界面,session中的token id不变;如果相等,则执行请求的方法,关键的一点是,此时session中的token id会被清空!

注意令牌的产生时机,它是在加载(或渲染)带有token标签的jsp页面时产生的,与请求或者转发无关,与方法是否被拦截无关。

    l  由于服务器端的token id是保存在session中的,因此不同的页面间可以共享,使用时注意,避免混乱。

    l  如果访问的方法属于被拦截的方法,验证通过之后,会清空session中的token id;如果验证不通过,session 中的token id不变,直到下一次加载(或渲染)带有token标签的jsp页面。

重复提交有一个必然的特征:它的token id是上一个。因此只要保证验证通过后session中保存的token id变化即可,清空是最直接的办法。要想通过验证,只有一个途径:重新加载(或渲染)带有token标签的jsp页面,使客户端的token id和服务器端的token id一致。


Struts Token使用:

1,先在一个Action中,调用saveToken(HttpServletRequest request)方法。然后转向带有表单的JSP页面。

2,在JSP页面提交表单给一个Action,再这个Action中进行是否为重复提交的判断。

在处理完客户端的请求后,服务器端会把处理结果返回给客户端。那么在response发送给客户端之前,将会产生一个新的Token,该Token的值除了传给客户端以外,也会将用户session中保存的旧的Token替换掉。也就是说,隐藏域的token值发生了变化,session中的token也发生了变化。

这时候,如果通过IE的返回按钮,回到原来画面的话,隐藏域中的token值又恢复到变化前,这时候如果再次提交的话,客户端传过来的Token值和服务器端的就不一致,这时候画面会迁移到指定画面。从而避免重复提交。


0 0