struts2令牌(token)内部原理

摘要:
小财最近接触了struts 2中的代币知识。因为这个知识点更重要,他想了解它,所以他满怀信心地在网上查找信息。结果,小蔡很无奈,互联网上的信息都是一样的。总之,一句话:“访问页面时,在页面上生成令牌id,并将相同的id保存在服务器的会话中。提交时,判断令牌id是否相同。”因此,只要您确保会话中保存的令牌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来声明不拦截哪些方法。

                  

令牌生成原理图:

struts2令牌(token)内部原理第1张

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

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

令牌拦截原理图:

struts2令牌(token)内部原理第2张

     从图中可以看出,令牌可以拦截的是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一致。

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

免责声明:文章转载自《struts2令牌(token)内部原理》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇误码率仿真,蒙特卡罗方法,置信度机器CPU load过高问题排查下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

微信公众平台开发步骤(包括自定义菜单、网页授权、分享功能)

第一步:填写服务器配置 第二步:验证服务器地址的有效性 第三步:依据接口文档实现业务逻辑 用户向公众号发送消息时,公众号方收到的消息发送者是一个OpenID,是使用用户微信号加密后的结果,每个用户对每个公众号有一个唯一的OpenID。此外,由于开发者经常有需在多个平台(移动应用、网站、公众帐号)之间共通用户帐号,统一帐号体系的需求,微信开放平台(open....

php的cookie和session相同主域名共享

如何使用chrome查看cookie和session详见另一篇文章,点这里 首先说cookie, $cookieDomain = '.elf.com'; setcookie('elf', 'im elf cookie', time()+300, '/', $cookieDomain); 如上代码设置的cookie,在主域名为 elf.com的所有二级域...

2、k8s api访问-token、RBAC、证书

1、token方式使用k8s restful api思维导图 https://liumiaocn.blog.csdn.net/article/details/100518110 token方式使用k8s restful api思维导图 2、apiserver认证 2.1、Kubernetes apiserver认证 Kubernetes apiserve...

shiro 框架基本讲解【转载】

shiro 框架基本讲解【转载】 什么是权限管理: 基本上涉及到用户参与的系统都要进行权限管理,权限管理属于系统安全的范畴,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源。 权限管理包括用户身份认证和授权两部分,简称认证授权。对于需要访问控制的资源用户首先经过身份认证,认证通过后用户具有该资源的访问...

防止一个用户登录多次的方法

在web开发时,有的系统要求同一个用户在同一时间只能登录一次,也就是如果一个用户已经登录了,在退出之前如果再次登录的话需要报错。 常见的处理方法是,在用户登录时,判断此用户是否已经在Application中存在,如果存在就报错,不存在的话就加到Application中(Application是所有Session共有的,整个web应用程序唯一的一个对象):...

WebSocket-java实现

一、所需jar 二、创建websocket.jsp(注意此页面链接,需要链接到自己的服务) 1 <%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%> 2 <% 3 String path = request.getContextPath...