关于重复提交验证问题

对于使用ajax方式提交的数据,怎么防止重复提交?

有两点问题:

1、如果禁用按钮,ajax异步提交,Jfinal的validate后台有验证,验证失败的话按钮被禁用了,用户无法继续使用!

2、如果用Jfinal的token方式,第二次提交时页面并没有刷新,token还是旧的,用户还是用不了。


评论区

JFinal

2018-11-30 16:50

每次进入表单页面之前,要走一个 action ,在这个 action 中使用 createToken 创建 token ,被提交的目标页面使用 validateToken() 即可

hb963724769

2018-11-30 17:22

@JFinal 页面不刷新,createToken根本过不去啊,都是空值,难道要在前端res取值之后,再设置隐藏值,然后再提交?

hb963724769

2018-11-30 17:27

@JFinal 这种是页面进入时候才会设置token,用户第一次提交没有问题,第二次提交时并没有从新进入页面,这时候不就错了吗?我的页面不能刷新

JFinal

2018-11-30 17:34

@hb963724769 还忘了在表单中要加个隐藏域了,否则值过不来 ,在表单中添加下面的代码:
#(token)

即可自动生成隐藏的表单域,如果你是 freemaker、jsp , 用一下:
${token}

JFinal

2018-11-30 17:34

jfinal enjoy 引擎用的 #(token)

hb963724769

2018-12-01 09:05

@JFinal 就是用Jfinal的引擎#(token),不过后台返回的是json数据,用来刷新datagrid,没有表单,如果要用是不是说我要把datagrid套在表单中,然后改用提交表单的方式提交数据。

JFinal

2018-12-01 12:03

@hb963724769 没有表单的情况,可以将 token 当成 json 数据中的一个值传到后端,但后端就不能使用 validateToken() 进行验证了

参考 validateToken() 对你的 josn 进行验证即可。 createToken() 仍然可用,但你的 json 数据中要想办法将 token 值用上,例如:

{
token : "#(_jfinal_token)",
你的 json 数据其它值在此
}

上面的 _jfinal_token 这个 key 值读取 token 的默认变量值,你也可以在创建 token 时手动指定,例如:
createToken("myTokenName")

JFinal

2018-12-01 12:03

其实,只要单步调试一下 com.jfinal.token.TokenManager 以及 validateToken() 内部工作机制,很容易就明白怎么做了,代码量极少,不超过 100 行

hb963724769

2018-12-01 15:24

@JFinal 这样好累啊,一个项目好多地方都是这样的,谢谢啊。。。看来只能重点页面加上后台验证,其他通过JS验证了。 谢谢大佬!!

hb963724769

2018-12-01 15:41

@JFinal createToken()应该是没用了,我怎么都在前端取不到值,不管我把#(token)放哪里都取不到,除非我返回的json数据中带上token变量.

hb963724769

2018-12-01 15:52

@JFinal 应该是找到取不到值的原因了,我定义了一个全球拦截器,我在全球拦截器中写上 createToken,前端可是正确取到值, 但是我不知道为什么?

hb963724769

2018-12-03 18:54

@JFinal 1、能不能具体说一下为什么我在请求数据action中createToken之后,为什么在前端和全球拦截器里面却都取不到token的值,必须要我在全球拦截器中ai.invoke()方法之后createToken前端才能取到值。(我用了shiro控制权限)
2、还有一个问题,如果后端validateToken不能使用(session中取不到值),我应该怎么比较,先createToken然后取出token,往缓存中放吗?

热门反馈

扫码入社