背景:
js lib: Ext 3.3.0,未使用 struts、Spring MVC;
所有的表单都由 Ext js 方法生成(即非传统 http form 形式, http 源代码中无 form 元素),后台 http request -> action 的处理机制是和 struts、Spring MVC 的实现相仿。
方案核心:
通过 token 机制来防止表单重复或外部提交(非常非常的寻常)。
方案实现:
如果用 struts 就简单了,加个<s:token/> 再配个 TokenInterceptor 就搞定了 (存在漏洞,详见底部)。
如果用 Spring MVC 就简单了,写个 TokenHandlerInterceptor extends HandlerInterceptorAdapter 再配置下也搞定了。
不用 struts、Spring MVC 其实也简单,参考 Spring MVC 在 http request -> action 的处理中加上拦截器机制,再参考 struts 实现 TokenInterceptor 就搞定了。
关于 token 值的提交方式:由于form非常规,无法往 form 里添加 token 元素,既然放不到 request body 里,那就放到 request header 里,放到 header 里其实相对来说更灵活些(另外似乎还能避免1个漏洞,详见底部)。
Ext request 加 header :
Ext.Ajax.defaultHeaders = {
'Req-Token': tokenValue
};
注:header 的名称是不区分大小写的,根据实际测试情况,IE下通常会把 header 名称都变成小写,而 Firefox 和 Chrome 基本上不会改变,header 名称和我们代码里所写的名称是一致的。后台获取 header 值时需注意这个情况。
同样的,response 里也加个 header,将新的 token 值传给客户端。
不专门提供一个获取 token 值的 servlet 的原因:主要是怕该 servlet 压力过大。
另外,不能将 token值的提交和form提交分开,必须在同一个请求中同时提交,原因:分开提交无法防止外部提交等非法提交方式。
关于是否需要进行 token 校验:由于 TokenInterceptor 配上了,则默认会对所有 request 均校验,为了支持按需进行校验,自定义了@Token 注解,需要校验的action方法只要加上 @Token 即可(注解是个好东西)。
特别注意:
CSRF
CSRF攻击原理解析
Struts2 csrf token绕过漏洞
分享到:
相关推荐
简单的ajaxt无刷新实现表单提交的实例(myeclipse 直接导入运行) 学习点: 1;ajax无刷新表单提交 2;ajax的运行历程 最简单明了的实例,清晰的帮你弄清上述概念,运行简单,只需解压该包,然后Myeclipse中file - ...
完整的jq ajax提交表单,奖解压后jq文档加入页面中,调用就可惟了。 表单结构 <form id="myForm" action="comment.php" method="post"> Name: <input type="text" name="name" /> Comment: <...
vue1/2 ajax提交表单
利用jquery的ajax提交表单数据到后台。后台使用spring.
利用ajax提交表单完整流程
jQuery.form.js是一个form插件,支持ajax表单提交和ajax文件上传.
ajax提交表单,并对提交中文时的乱码进行处理.
ajaxform,ajax表单提交,方便客户端ajax验证,方便用户体验,人性化表单处理
Ajax使用jQuery提交表单 文件
防止用户误操作,重复提交
ajaxForm异步提交表单(含图片)ajaxForm异步提交表单(含图片)ajaxForm异步提交表单(含图片)
ajax提交的jq版本,相当实用
先说对话框(Dialog)里的表单提交 错误方案 说起错误方案,比如,点击提交按钮,本地验证,验证通过立即让按钮不可点,这些没问题,而我的错误点概括是:在某个最后执行的回调函数的最后一行,我做了2个操作:1,...
Ajax如何无刷新提交form里面的内容。
1AJAX避免用户重复提交请求实现方案设计说明书[定义].pdf
本文实例为大家分享了ajax提交时校验表单的方法,供大家参考,具体内容如下 方法一: 代码示例: 巧妙设计之处:ajax提交的话,不能够进行校验拦截,设置一个flag来判断,很巧妙的设计之处,故收藏! function ...
该例子是使用 Ajax 提交 Ext 表单,并通过 success 和 failer 返回相应的值。
jquery.js + jquery-form.js + springMVC实现ajax提交form表单和上传图片,上传图片成功js可以获取图片保存相对路径。
使用AJAX提交Form表单使用AJAX提交Form表单使用AJAX提交Form表单
表单进行无刷新提交,ajax技术 if (!this.length) { log('ajaxSubmit: skipping submit process - no element selected'); return this; } var method, action, url, $form = this; if (typeof options == ...