长点小知识。。表单重复提交的问题。。

1.Struts为了解决对某个请求不断地提交,采用token令牌机制。。

具体实现过程大概就是 客户端在提交请求的时候,顺便传送一个令牌值,这个值是根据session id 和当前时间long值计算出来,通过隐藏字段保存在页面中。。提交的时候,服务器也会产生一个token值,当提交之后,服务器在处理请求之前,先将这两个值进行比较,如果一致,那么OK,不是重复提交。并且在请求处理完返回客户端以前,也同样产生一个新的token值。服务器,客户端同时都保存这个toke值。如果当用户退回到刚开始的页面再次提交的时候,此时又产生一个新的token值,那么 跟服务器的token值就不一样了,所以就不能再提交被处理了。。有效的防止了 重复提交。。

用代码实现就是:在action中明确保存一下这个token值,然后再拿服务器端与客户端的值都比较一下。。做相应处理。

例如:以在数据库中插入一条数据来说明如何防止重复提交。

在Action中的add方法中,我们需要将Token值明确的要求保存在页面中,只需增加一条语句:saveToken(request);,如下所示:

public ActionForward add(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
//前面的处理省略
saveToken(request);  //保存 token值。。
return mapping.findForward("add");
}

在Action的insert方法中,我们根据表单中的Token值与服务器端的Token值比较,如下所示:
public ActionForward insert(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
if (isTokenValid(request, true)) {
// 表单不是重复提交
//这里是保存数据的代码
} else {
//表单重复提交
saveToken(request);
//其它的处理代码
}
}

 

2.Struts2解决表单重复提交问题,提供了<s:token>这个表签

首先在客户端页面上写<s:struts>标签

然后 在Struts2的配置文件struts.xml中定义拦截器,如下:

<action.....>

        <interceptor-ref name="token"/>

        .....................

     </action>

 

这个拦截器的实现原理也是一样的,当有请求的时候,也是先判断表单中的token值和当前会话session中的token值是不是一样,要是一样表明是第一次提交,否则是重复提交。。。。同样提交处理后,token值也做改变。。防止用户重复提交。。。

 

ps.学了这么久,竟然今天刚知道有这一点。。狠狠的被鄙视了一下子。。诶。。记住了!!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值