首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2EE开发 >

saveToken防止2次提交的有关问题

2012-03-21 
saveToken防止2次提交的问题在action里Stringtoken_requestrequest.getParameter( org.apache.struts.ta

saveToken防止2次提交的问题
在action里


    String   token_request   =   request.getParameter( "org.apache.struts.taglib.html.TOKEN ");
                System.out.println( "token   in   request   is: "+   token_request);

                ActionMessages   errors   =   new   ActionMessages();
                if(!isTokenValid(request)){
      errors.add(ActionMessages.GLOBAL_MESSAGE,
                                                      new   ActionMessage( "error.invalid.token "));

                      saveErrors(request,   errors);
                      saveToken(request);
                      return   (new   ActionForward(mapping.getInput()));
    }
    else{
                resetToken(request);
    }  


可得到的token_request   是nulll
在页面说自动生成个字段,什么都不用写吗?

<form   name= "examQuerForm "   action= "/XXX.do "       method=post>
</fom>
需要加什么吗??


[解决办法]
在JSP页面之前的Action里要先调用saveToken(request);方法

<form> 不用增加什么,当检测到session中有令牌jsp会自动添加一个 <input type= 'hidden ' xxxxx>

转发关系如下:

prepareAction - index.jsp - postAction

preareAction中调用saveToken
postAction中使用isTokenVald验证
[解决办法]
struts有自带的Token(令牌)的机制来解决重复提交(包括后退,刷新等).举例:

 假设:假设有一个新增用户的填写表单页面,填写完后点击"提交"按钮完成数据库录入功能,要求不能重复提交(指类似刷新页面的情况).此时,需要有两个action(第一个action用来生成hidden的token值.第二个action用来校验token值,通过判断来决定是不是重复提交,不是则提交操作,否则提示错误)和至少一个页面(保存token值和填写用户信息的录入页面)来完成校验是否重复提交.此处有两个页面来完成.

  为了方便,用户表只有两个字段用户名<username>和密码<password>:

具体逻辑如下:

index.jsp--链接--> PrepareAddUserAction.java--转发并生成token--> addUser.jsp--提交-->
AddUserAction.java--首先校验 '是否重复提交 ',是提示错误信息,不是,执行数据库操作.

部分相关代码(省略formbean的代码):
========index.jsp========
<html> <head> <title> 测试 </title> </head> <body>
<a href= " <%=request.getContextPath()%> /PrepareAddUserAction.java "> 新增用户 </a>
</body> </html>

=========PrepareAddUserAction.java=========
package com.tseyimwah.struts.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

public class PrepareAddUserAction extends Action {
public ActionForward execute(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response) throws HibernateException {
.........//相关方法
saveToken(request); //在下一个页面addUser.jsp生成hidden类型的token值
return mapping.findForward( "addUser ");//页面跳转
}
}



==========addUser.jsp=============
此处代码没有什么要求,含有form的普通struts页面,代码省略,里面的 "提交 "按纽给AddUserAction.java,即 <html:form action= "/AddUserAction.do " method= "post ">

============AddUserAction.java=====
package com.tseyimwah.struts.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

public class AddUserAction extends Action {
public ActionForward execute(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response) throws HibernateException {

//判断token值,如果是重复提交跳转到错误页面则提示出错信息,否则执行相关的数据库操作
if (!isTokenValid(request)){
request.setAttribute(GlobalKeys.MESSAGE_ID, "不允许重复提交! ");//设置出错信息
return (mapping.findForward( "errorPage "));
} else
resetToken(request); //重新设置token值,可不用
}
......
......//其他的相关方法,如设置相关属性值,调用相关的数据库操作等
return (mapping.findForward( "addUserSucess "));//新增用户成功的页面
}


这只是将相关的必要代码写出,根据需要可以改写相关的代码.
[解决办法]
你可以根据你需要,按照我上面的例子去改写你的相关程序.
-------------------------------------

public ActionForward insertMethod(ActionMapping mapping,ActionForm form, HttpServletRequest request,
HttpServletResponse response) throws InsureWebException{

String token_request = request.getParameter( "org.apache.struts.taglib.html.TOKEN ");
System.out.println( "token in request is: "+ token_request);

ActionMessages errors = new ActionMessages();
if(!isTokenValid(request)){
errors.add(ActionMessages.GLOBAL_MESSAGE,
new ActionMessage( "error.invalid.token "));

saveErrors(request, errors);
saveToken(request);
return (new ActionForward(mapping.getInput()));
}
else{
resetToken(request);
}

我估计你的问题应该是在执行上面的action之前的前一个action里没有保存token值(saveToken(request);),所以导致在你的页面里没有生成token值,顾你在这个action里取到是token为null
[解决办法]
你进入jsp页面之前没有saveToken(request);

当然是null了

热点排行