在Struts利用同步令牌(Token)来解决表单被重复提交的问题

本文介绍如何使用Struts的同步令牌机制防止表单重复提交。通过添加过滤器、预注册Action及最终注册Action,确保用户操作不会因刷新而多次执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如果表单被重复的提交,第二次提交可能产生错误,用户不断的刷新页面,调用对应的Action,不进行控制,如注册页面不断的和数据库交互,对于服务器端负载太大。
在此利用Struts的同步令牌机制来解决问题
主要是利用了Action类中的一些方法
(1)saveToken(HttpServletRequest request)
生成一个新的令牌值并保存在session中(每次生成的都不一样)
(2)isTokenValid(HttpServletRequest request)
判断当前session和请求参数中的令牌值是否匹配,若匹配返回true,若不匹配返回false
(3)resetToken(HttpServletRequest request)
将session中的令牌值删除

下面以一个简单的注册的例子来介绍
现在有一个写好的register.jsp的登录页面,现在我们对它来做一下修改,使它能够防止被重复的提交。
1.添加一个过滤器,使得在执行register.jsp之前先执行过滤器
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
// TODO Auto-generated method stub
HttpServletRequest request =
(HttpServletRequest)arg0;
//跳转到PreRegisterAction
request.getRequestDispatcher
("/token/preRegister.do")
.forward(arg0, arg1);
}
过滤器执行preRegister
2.添加Action,PreRegisterAction.java,这个action很简单,就是生成一个新的令牌放在session中
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
//生成一个新的令牌值放置在session中
super.saveToken(request);
return new ActionForward
("/token/register.jsp");
}
3.在register.jsp页面上的form改为<html:form action="/token/sufRegister">
4.添加Action,SufRegisterAction.java
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
RegisterForm registerForm = (RegisterForm) form;
//判断session和请求参数中的令牌值是否匹配
if(!super.isTokenValid(request)){//不匹配
//若不匹配说明重复提交表单了,那么在
//页面上要提示一下用户
ActionMessages errors =
new ActionMessages();
ActionMessage message =
new ActionMessage("error.token");
errors.add("token", message);
super.saveErrors(request, errors);
return new ActionForward
(mapping.getInput());
}else{//匹配
//若匹配说明用户是第一次提交表单
//构造一个Customer对象,并调用模型层中
//的业务接口方法register()进行用户注册

System.out.println("注册成功...");
//若注册成功要从session中删除令牌值
super.resetToken(request);
return new ActionForward
("/token/login.jsp");
}

}


这样就完成了利用同步令牌来防止网页重复提交的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值