开发者社区> thinkyoung> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

struts2令牌(token)内部原理

简介:       小菜最近接触了struts2中的令牌知识,由于该知识点比较重要,因此想弄明白些,于是满怀信心的上网查阅资料,结果让小菜很无奈,网上的资料千篇一律,总结出来就一句话:“访问页面时,在页面产生一个token id,同时在服务器的session中保存一个同样的id,提交时判断如果相同怎么样不相同怎么样。
+关注继续查看

 

 

    小菜最近接触了struts2中的令牌知识,由于该知识点比较重要,因此想弄明白些,于是满怀信心的上网查阅资料,结果让小菜很无奈,网上的资料千篇一律,总结出来就一句话:“访问页面时,在页面产生一个token id,同时在服务器的session中保存一个同样的id,提交时判断如果相同怎么样不相同怎么样。。。”

    可能是小菜愚笨,实在是无法从这么精炼的描述中体会令牌的精髓。

    肤浅的那么一说,然后上来就是一堆代码,有时候对初学者的帮助可能不是很大,如果能够介绍一下其中的原理,无疑会加快读者学习速度。

    经过刻苦的研究,下面小菜来介绍一下,令牌究竟是如何做到防止界面刷新的。

    本文不涉及令牌具体用法,只讲原理。

    首先需要说明的是,在struts2框架中使用令牌基本上就是两步:

        l  在jsp页面中使用<s:token></s:token>标签,可以放在表单中任何位置,这个标签的作用就是在页面中产生一个token id,可以通过“查看源文件”的形式看到。为什么要放在表单中呢?因为这个是要提交到服务器的,要不然服务器怎么知道你的id是多少?

        l  在struts2核心配置文件中为token拦截器添加参数,来指明需要拦截哪些方法,例如:<interceptor-ref name="token"><param name="includeMethods">save</param></interceptor-ref>,指明拦截save方法。当然也可以用excludeMethods来声明不拦截哪些方法。

                  

令牌生成原理图:

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

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

 

令牌拦截原理图:

     从图中可以看出,令牌可以拦截的是Action中的方法。

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

 

综上,关于令牌的使用,记住以下几点,基本可以应对各种复杂的令牌应用场景

 

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

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

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

 

    再多啰嗦一些,为什么验证通过后要清空session中的token id呢?其实不难理解,从宏观上来思考,重复提交有一个必然的特征:它的token id是上一个。因此只要保证验证通过后session中保存的token id变化即可,清空是最直接的办法。要想通过验证,只有一个途径:重新加载(或渲染)带有token标签的jsp页面,使客户端的token id和服务器端的token id一致。

    小菜总是希望自己的文章能够帮助更多的人,因此写的有点啰嗦,大家见谅!

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Spring Cloud 升级之路 - 2020.0.x - 7. 使用 Spring Cloud LoadBalancer (2)
Spring Cloud 升级之路 - 2020.0.x - 7. 使用 Spring Cloud LoadBalancer (2)
65 0
Jboss7上+maven搭建struts2+spring3+hibernate3完整能运行
这是一个采用maven项目管理工具,集成struts2+spring3+hibernate3+mysql的一套框架模板,只是提供集成成功,struts2我采用的是零配置方式的,如果对着stuts2零配置方式不理解的,则回头学习一下。
1108 0
Struts2原理详解
 上图来源于Struts2官方站点,是Struts 2 的整体结构。   Struts2框架由3个部分组成:核心控制器FilterDispatcher、业务控制器和用户实现的业务逻辑组件。
987 0
struts2.1.6的过滤器有问题吗?
在使用struts的过程中,开始的时候真是问题多多。因为我的版本是最新的2.1.6,而之前的教程也最多是2.0.X的。不过李刚最近新出了第二版的《struts2.1权威指南》,七八百页,才60多块钱(打完折后的),真的不贵,呵呵。
862 0
+关注
722
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载