saveToken防止2次提交的问题 在JSP页面之前的Action里要先调用saveToken(request);方法<form>不用增加什么,当检测到session中有令牌jsp会自动添加一个<input type='hidden' xxxxx>转发关系如下:prepareAction - index.jsp - postActionpreareAction中调用saveTokenpostAction中使用isTokenVald验证 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我的逻辑是首先在从左面菜单树一个url 到1个jspjsp大概就是<form name="formName" action="/XXX.do?method="insertMethod" method=post></form>在action里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);if(!isTokenValid(request)){ System.out.println("1111111111111111111"); saveToken(request); } else{ System.out.println("222222222222222222222"); resetToken(request); } 可没反映得到的token_request 是null 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了 up以下 我刚开始也是 忘记写那个action 来保存 savetoken了 最后加了个连接 把所有保存的页面都给连接下 通过action在转过去哈哈 看了挺多关于token的介绍,这个应该是最清楚的了。谢谢 我今天为了防止重复提交应用了saveToken(request),结果一直无法正常使用,只提交一次信息的时候也提示不能重复提交,具体情况如下:项目是ssh结构,一个模块的跳转和提交在一个action的不同方法中,link.do?method=postPo是进入提交页面,link.do?method=editPo是提交信息,在进入提交页面的方法中应用了saveToken(request);saveToken(request);在提交方法中做判断,如果重复提交输出错误信息if(!isTokenValid(request,true)){System.out.println("//////////////////////");ActionMessages error = new ActionMessages();saveErrors(request, error);return new ActionForward("/link.do?method=postPo");}else{//省略保存表单信息代码resetToken(request);}结果一直进入到"提示重复提交的分支中",这是为什么 java导出excel 第一次工作经验哪里来的啊 谁手上有开源的CRM 系统,最好是做保险行业的。需要用SSH框架 关于soap缓存的问题 如果面试的时候问你哪个项目最成功? 关于提交验证(struts) Spring整和Hibernate启动后的问题 关于TOMCAT版本的问题,不是很理解,请帮忙 JDBC连接池的问题,各位高手请指教(在线等) 下载ftp上的文件,调用changeWorkingDirectory方法无法正确解析包含中文的路径,求解决方法。 使用Struts的Token机制,控制form重复提交 POI写EXCEL公式出现#REF如何解决
jsp大概就是
<form name="formName" action="/XXX.do?method="insertMethod" method=post>
</form>
在action里
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);
if(!isTokenValid(request)){
System.out.println("1111111111111111111"); saveToken(request);
}
else{
System.out.println("222222222222222222222");
resetToken(request);
}
可没反映得到的token_request 是null
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
我今天为了防止重复提交应用了saveToken(request),结果一直无法正常使用,只提交一次信息的时候也提示不能重复提交,
具体情况如下:
项目是ssh结构,一个模块的跳转和提交在一个action的不同方法中,
link.do?method=postPo是进入提交页面,
link.do?method=editPo是提交信息,
在进入提交页面的方法中应用了saveToken(request);
saveToken(request);在提交方法中做判断,如果重复提交输出错误信息
if(!isTokenValid(request,true)){
System.out.println("//////////////////////");
ActionMessages error = new ActionMessages();
saveErrors(request, error);
return new ActionForward("/link.do?method=postPo");
}
else{
//省略保存表单信息代码
resetToken(request);
}
结果一直进入到"提示重复提交的分支中",这是为什么