在jfinal中对表单重复提交的解决方法不知道我理解的对不对
后台:
public void add() { createToken("blogToken", 30*60); //过期时间设置为30分钟 render("add.html"); } @Before(BlogValidator.class)public void save() { getModel(Blog.class).save(); list(); }
页面的话在你要防止重复提交数据的form中添加
前端页面:
<input type="hidden" name="blogToken" value="${blogToken}" />
接下来你可以在BlogValidator中的
protected void validate(Controller c) { validateToken("blogToken", "msg", "alert('上次已保存,请不要重复提交')"); }
也可以把validateToken放到action中如果返回true表示不是重复提交!
如果false表示是重复提交
疑问:
如果我用ajax去异步提交表单,验证成功后我的token失效了,是否要在后台处理表单的action后返回一个新的token到前端页面,不然前端此时保存的token是失效的永远无法提交下次表单
如果我设了有效期,用户在页面停留太久了导致token失效,他等失效后去提交表单,这个时候我如何处理去刷新他的token,我怎么区别这个token是由于用户等待时间太久导致token失效呢,还是由于用户提交了2次token才失效了,这两个区别?
机制定好了,具体怎么玩看你自己的应用场景,你上面的疑问是具体问题,而 token 的机制是一个底层问题
此外,如果 BlogValidator 中的验证代码很少,也可以不需要这个类,简单的在 controller 中通过下面的代码来验证 token 即可:
if (validateToken()) {
do service;
} else {
renderJson("msg", "请勿重复提交");
}