实践struts之token防止回退重复提交表单

动用google,找到一两篇相关文章,实践成功。

建一个action基类TokenAction,使用模板方法,如下:

 public ActionForward execute( ActionMapping mapping,
                                                ActionForm form,
                                                HttpServletRequest request,
                                                HttpServletResponse response) throws Exception {
       ActionForward forward = null;
       if (isTokenValid(request, true)) {
            forward = doExecute(mapping, form, request, response);   
      } else {
           saveToken(request);
           throw new TokenRepeatException(MessageLocator.getMessage("error.token"));
      }
      return forward;
 }

 public abstract ActionForward doExecute( ActionMapping mapping,
                                                                  ActionForm form,
                                                                  HttpServletRequest request,
                                                                  HttpServletResponse response) throws Exception;

注:TokenRepeatException是自定义异常,它的父类ApplicationException在struts-config.xml中被声明,以便于action捕获。如下(我的错误消息资源是用spring来配的,没有用struts的):

<struts-config>

    <global-exceptions>
        <exception handler="com.chage.framework.struts.BusinessExceptionHandler" key="todo" type="com.chage.framework.exception.ApplicationException" />
       
    </global-exceptions>

.....

</struts-config> 

然后,观察这个异常处理类:

public class BusinessExceptionHandler extends ExceptionHandler {

 public ActionForward execute(Exception exception,
                                                ExceptionConfig config,
                                               ActionMapping mapping,
                                               ActionForm form,
                                               HttpServletRequest request,
                                               HttpServletResponse response)  throws ServletException  {
              request.setAttribute("exception", exception);
             if (exception instanceof TokenRepeatException) {
                  return mapping.findForward("tokenRepeat");   
            } else
               //display error info in action come from
               return mapping.getInputForward();
    }

}

有几个注意事项,记录备案:
1.关于异常信息哪里显示:   异常显示当然不能在表单页面上了,比如说,你成功更新了一条记录后,返回list的页面,当用户回退重复提交,再返回这个list页并显示提示信息是比较合理的,最好是定义另外一个forward,我统一转向forward名称为 “tokenRepeat“,每个需要控制重复提交的action中必须定义它。最后在jsp页上加上异常显示:

<logic:present name="exception">
  <font color=red> <bean:write name="exception" property="message"/></font><br>
</logic:present>


2.你必须通过action来转发而不是直接进入jsp页,因为你得调用saveToken方法来记录令牌字。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值