发文章
发文工具
撰写
网文摘手
文档
视频
思维导图
随笔
相册
原创同步助手
其他工具
图片转文字
文件清理
AI助手
留言交流
小菜最近接触了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一致。
小菜总是希望自己的文章能够帮助更多的人,因此写的有点啰嗦,大家见谅!
来自: 昵称10504424 > 《架构设计》
0条评论
发表
请遵守用户 评论公约
Struts之通过Session Token(Session令牌)来防止表单重复提交
Struts之通过Session Token(Session令牌)来防止表单重复提交通过SessionToken(Session令牌):当客户端请求页面时,服务器会通过toke...
Struts2中防止表单重复提交的两种方式
这种方法是在用户要提交的表单中,加入一个<s:token>标签,这样,当浏览器第一次访问这个带有<s:token>标签的页面时,在服务器中,解析<s:token>标签的类(TokenTag.class),会生成...
关于<s:token>的源代码分析
Struts2中使用token避免重复提交的方法
Struts2中使用token避免重复提交的方法本文Struts2中使用token避免重复提交的方法。.<interceptor-ref name="token"/> <interceptor-ref name="token-session"/> <...
Struts2防止表单重复提交
在struts-default.xml中定义了很多拦截器,这些拦截器就是用来完成许多强劲功能的保证,而且可以根据已定义的若干拦截器中的某几个拦截器构建成interceptor-stack拦截器栈,其实拦截器栈还可以由拦截器...
Struts解决表单重复提交问题
如何利用上述方法应用令牌机制解决重复提交问题: 以用户注册为例: 在用户请求newUser.jsp之前,首先把请求转发到PrepareAction,PrepareAction 调用saveToken方法,创建一个新的令...
常见的服务器鉴权方式
OAuth引入了一个授权层,用来分离两种不同的角色: 客户端和资源所有者.资源所有者同意后,资源服务器向客户端颁发令牌,客户端通过令牌去请...
第 82 天:Python Web 开发之 JWT 简介
第 82 天:Python Web 开发之 JWT 简介。导入 jwt 模块定义 header,并且设置签名算法为 HS256定义 payload,作为传输信息定义 secret,...
HTTP会话原理解释与应用
HTTP会话原理解释与应用。首先,用户端向服务端发送一个请求,服务端接收到请求(这里忽悠无须会话控制的情况)后,初始化会话,生成相...
微信扫码,在手机上查看选中内容