struts2的token拦截器的原理及作用

        众所周知struts2有着自己的token拦截器,主要是用于防止用户进行表单的重复提交的。但是一直没搞明白两个问题:token拦截器实现的原理是如何的?哪些action需要使用token拦截器去防止其重复提交?下面根据自己最近的学习给出一个自己的经验。


        首先,实现token拦截器基本需要两步:

        1、在jsp的form表单任何地方中加一句<s:token></s:token>,这个标签的作用是在表单中生成一个隐藏的token属性,其值为一串随机数,这个随机数在你每一次刷新该页面或者打开该页面都会重新随机生成,如下:(可在网页上查看源码或者审查元素发现)

<input type="hidden" name="struts.token.name" value="token">
<input type="hidden" name="token" value="7KCFGRK6J0X99Q8G97ICL2NX4HWVXE81">

        2、在struts配置文件struts.xml中为token拦截器添加拦截参数,并添加拦截结果<result name="invalid.token"></result>,如下:

<package name="student" namespace="/student" extends="struts-default">
    <interceptors> //配置拦截器
        <interceptor-stack name="tokenStack"> //命名拦截器栈,名字随便
            <interceptor-ref name="token"/> //此拦截器为token拦截器,struts已经实现
            <interceptor-ref name="defaultStack" /> //默认拦截器,注意顺序,默认拦截器放在最下面
        </interceptor-stack>
    </interceptors>
	     
    <default-interceptor-ref name="tokenStack" /> //让该包中所有action都是用我们配置的拦截器栈,名字和上面的对应

    <action name="changeinfo" class="sChangeInfoAction">
        <result name="success">/WEB-INF/student/person_info.jsp</result>
        <result name="invalid.token">/WEB-INF/student/person_info.jsp</result> //这个结果是拦截后返回的页面,必须要配置
    </action>
</package>


        第一个问题:token拦截器实现的原理是如何的?

        所谓的token,中文译名“令牌”。顾名思义,就是使用一种验证,验证对了,就让你继续访问action,验证错了,直接把你拦截住,交给指定的页面。验证的关键步骤就是token拦截器的原理:当浏览器访问一个带有<s:token></s:token>标签的页面时,服务器生成一个随机数,把这个随机数放入session中,也放入表单中隐藏的token属性中。显然,此时这两个随机数是相等的。而后,当你向服务器提交表单时,表单中隐藏的token属性也会传给服务器。此时如果访问的的action使用了token的拦截器(即上面配置的),那么服务器会从session中得到刚才的随机数,将其和表单的token属性比较,看两者是否相同。如果相等,表示此次访问不是重复提交,无需拦截,清空session中的随机数,接着正常访问action。如果不相等,则直接拦截,不会继续访问action,直接跳到<result name="invalid.token">指定的页面,并且session中的随机数不变。

        至于为什么验证通过后要清空session中的随机数值呢?因为重复提交必然有一个特性:它的token属性是上一个,因此清空session中的随机数后就保证了不相等。想要通过验证则必须重新加载带有<token>标签的jsp。

        下面盗两张图片增加理解:

                                                          token生成原理图


                                                              token拦截原理图


        第二个问题:哪些action需要使用token拦截器去防止其重复提交?

        我在项目中token一般用在向数据库写数据的action,而对于向数据库读取数据的action则不用,具体情况具体分析。另外,在url中直接访问action也会导致拦截,因为服务器无法接收到form中的token属性,因此只有提交form才有机会访问action。

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值