浏览 2968 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-05-26
在此利用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"); } } 这样就完成了利用同步令牌来防止网页重复提交的问题。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |