??xml version="1.0" encoding="utf-8" standalone="yes"?>久久精品一区二区三区不卡免费视频 ,77777影视视频在线观看 ,日韩三级视频http://www.aygfsteel.com/jorwen/category/7234.htmlzh-cnTue, 27 Feb 2007 10:53:10 GMTTue, 27 Feb 2007 10:53:10 GMT60用Struts的Token机制解决表单重复提交http://www.aygfsteel.com/jorwen/articles/53508.html方佳?/dc:creator>方佳?/author>Sat, 17 Jun 2006 13:23:00 GMThttp://www.aygfsteel.com/jorwen/articles/53508.htmlhttp://www.aygfsteel.com/jorwen/comments/53508.htmlhttp://www.aygfsteel.com/jorwen/articles/53508.html#Feedback0http://www.aygfsteel.com/jorwen/comments/commentRss/53508.htmlhttp://www.aygfsteel.com/jorwen/services/trackbacks/53508.html  
  q时其实也就是两点,W一Q你需要在h中有q个令牌|h中的令牌值如何保存,其实和我们qx在页面中保存一些信息是一LQ通过隐藏字段来保存,保存的Ş式如Q?〈input type="hidden" name="org.apache.struts.taglib.html.TOKEN" value="6aa35341f25184fd996c4c918255c3ae"〉,q个value是TokenProcessorcM的generateToken()获得的,是根据当前用Lsession id和当前时间的long值来计算的。第二:在客L提交后,我们要根据判断在h中包含的值是否和服务器的令牌一_因ؓ服务器每ơ提交都会生成新的TokenQ所以,如果是重复提交,客户端的Token值和服务器端的Token值就会不一致。下面就以在数据库中插入一条数据来说明如何防止重复提交?br />  
  在Action中的addҎ(gu)中,我们需要将Token值明的要求保存在页面中Q只需增加一条语句:saveToken(request);Q如下所C:
public ActionForward add(ActionMapping mapping, ActionForm form,
  
  HttpServletRequest request, HttpServletResponse response)
  
  
//前面的处理省?/span>
  
  saveToken(request);
  
  
return mapping.findForward("add");
  
  }在Action的insertҎ(gu)中,我们Ҏ(gu)表单中的Tokeng服务器端的Token值比较,如下所C:
  
  
public ActionForward insert(ActionMapping mapping, ActionForm form,
  
  HttpServletRequest request, HttpServletResponse response)
  
  
if (isTokenValid(request, true)) {
  
  
// 表单不是重复提交
  
  
//q里是保存数据的代码
  
  }
 else {
  
  
//表单重复提交
  
  saveToken(request);
  
  
//其它的处理代?/span>
  
  }

  
  }
其实使用h很简单,举个最单、最需要用这个的例子Q?br />  
  一般控刉复提交主要是用在Ҏ(gu)据库操作的控制上Q比如插入、更新、删除等Q由于更新、删除一般都是通过id来操作(例如QupdateXXXById, removeXXXByIdQ,所以这cL作控制的意义不是很大Q不排除个别现象Q,重复提交的控制也׃要是在插入时的控制了?br />  
  先说一下,我们目前所做项目的情况Q?br />  
  目前的项目是用StrutsQSpringQIbatisQ页面用jstlQStruts复杂View层,Spring在Service层提供事务控ӞIbatis是用来代替JDBCQ所有页面的讉K都不是直接访问jspQ而是讉KStructs的ActionQ再由Action来ForwardC个JspQ所有针Ҏ(gu)据库的操作,比如取数据或修改数据Q都是在Action里面完成Q所有的Action一般都l承BaseDispatchActionQ这个是自己建立的类Q目的是为所有的Action做一些统一的控Ӟ在Struts层,对于一个功能,我们一般分Z个ActionQ一个Action里的功能是不需要调用Struts的验证功能的Q常见的Ҏ(gu)名称有add,edit,remove,view,listQ,另一个是需要调用Struts的验证功能的Q常见的Ҏ(gu)名称有insert,updateQ?br />  
  拿论坛发脓(chung)来说吧,论坛发脓(chung)首先需要蟩转到一个页面,你可以填写帖子的主题和内容,填写完后Q单几Z提交”,贴子发表了Q所以这里经q两个步骤:
  
  1、{C个新增的面Q在Action里我们一般称为addQ例如:
public ActionForward add(ActionMapping mapping, ActionForm form,
  
  HttpServletRequest request, HttpServletResponse response)
  
  
throws Exception {
  
  
//q一句是输出调试信息Q表CZ码执行到q一D了
  
  log.debug(
":: action - subject add");
  
  
//your code here
  
  
//q里保存Token?/span>
  
  saveToken(request);
  
  
//跌{到add面Q在Structs-config.xml里面定义Q例如,跌{到subjectAdd.jsp
  
  
return mapping.findForward("add");
  
  }

2、在填写标题和内容后Q选择 提交 Q会提交到insertҎ(gu)Q在insertҎ(gu)里判断,是否重复提交了?br />
public ActionForward insert(ActionMapping mapping, ActionForm form,
  
  HttpServletRequest request, HttpServletResponse response)
{
  
  
if (isTokenValid(request, true)) {
  
  
// 表单不是重复提交
  
  
//q里是保存数据的代码
  
  }
 else {
  
  
//表单重复提交
  
  saveToken(request);
  
  
//其它的处理代?/span>
  
  }

  
  }

下面更详l一点(注意Q下面所有的代码使用全角括号Q:
  
  1、你惛_贴时Q点几Z我要发贴”链接的代码可以里这LQ?br />  
  〈html:link action="subject.do?method=add"〉我要发贴?html:link?br />  
  subject.do ?method q些在struct-config.xml如何定义我就不说了,点击链接后,会执行subject.do的addҎ(gu)Q代码如上面说的Q蟩转到subjectAdd.jsp面。页面的代码大概如下Q?br />
  〈html:form action="subjectForm.do?method=insert"?br />  
  〈html:text property="title" /?br />  
  〈html:textarea property="content" /?br />  
  〈html:submit property="发表" /?br />  
  〈html:reset property="重填" /?br />  
  〈html:form?/span>
如果你在addҎ(gu)里加了“saveToken(request);”这一句,那在subjectAdd.jsp生成的页面上Q会多一个隐藏字D,cM于这栗input type="hidden" name="org.apache.struts.taglib.html.TOKEN" value="6aa35341f25184fd996c4c918255c3ae"〉,
  
  2、点d表后Q表单提交到subjectForm.do里的insertҎ(gu)后,你在insertҎ(gu)里要表单的数据插入到数据库中,如果没有q行重复提交的控Ӟ那么每点Mơ浏览器的刷新按钮,都会在数据库中插入一条相同的记录Q增加下面的代码Q你可以控制用L重复提交了?br />
if (isTokenValid(request, true)) {
  
  
// 表单不是重复提交
  
  
//q里是保存数据的代码
  
  }
 else {
  
  
//表单重复提交
  
  saveToken(request);
  
  
//其它的处理代?/span>
  
  }

注意Q你必须在addҎ(gu)里用了saveToken(request)Q你才能在insert里判断,否则Q你每次保存操作都是重复提交?br />  
  C一点,Struts在你每次讉KAction的时候,都会产生一个o牌,保存在你的Session里面Q如果你在Action里的函数里面Q用了saveToken(request);Q那么这个o牌也会保存在q个Action所Forward到的jsp所生成的静态页面里?br />  
  如果你在你Action的方法里使用了isTokenValidQ那么Struts会将你从你的request里面去获取这个o牌|然后和Session里的令牌值做比较Q如果两者相{,׃是重复提交,如果不相{,是重复提交了?br />  
  ׃我们目的所有Action都是l承自BaseDispatchActionq个c,所以我们基本上都是在这个类里面做了表单重复提交的控Ӟ默认是控制addҎ(gu)和insertҎ(gu)Q如果需要控制其它的Ҏ(gu)Q就自己手动写上面这些代码,否则是不需要手写的Q控制的代码如下Q?br />
public abstract class BaseDispatchAction extends BaseAction {
  
  
protected ActionForward perform(ActionMapping mapping, ActionForm form,
  
  HttpServletRequest request, HttpServletResponse response)
  
  
throws Exception {
  
  String parameter 
= mapping.getParameter();
  
  String name 
= request.getParameter(parameter);
  
  
if (null == name) //如果没有指定 method Q则默认为 list
  
  name 
= "list";
  
  }

  
  
if ("add".equals(name)) {
  
  
if ("add".equals(name)) {
  
  saveToken(request);
  
  }

  
  }
 else if ("insert".equals(name)) {
  
  
if (!isTokenValid(request, true)) {
  
  resetToken(request);
  
  saveError(request, 
new ActionMessage("error.repeatSubmit"));
  
  log.error(
"重复提交Q?/span>");
  
  
return mapping.findForward("error");
  
  }

  
  }

  
  
return dispatchMethod2(mapping, form, request, response, name);
  
  }

  
  }


]]>
用struts向数据库中储存图?/title><link>http://www.aygfsteel.com/jorwen/articles/29416.html</link><dc:creator>方佳?/dc:creator><author>方佳?/author><pubDate>Wed, 01 Feb 2006 03:48:00 GMT</pubDate><guid>http://www.aygfsteel.com/jorwen/articles/29416.html</guid><wfw:comment>http://www.aygfsteel.com/jorwen/comments/29416.html</wfw:comment><comments>http://www.aygfsteel.com/jorwen/articles/29416.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/jorwen/comments/commentRss/29416.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/jorwen/services/trackbacks/29416.html</trackback:ping><description><![CDATA[     摘要: q个例子是通过用Struts的FormFile来写入到MySQL中。。。用用户通过选一个图片,然后按submit可以存入数据库中其中先要徏立一个表:create table test ( name varchar(20), pic blob );在MySQL的test库中   1<%@&n...  <a href='http://www.aygfsteel.com/jorwen/articles/29416.html'>阅读全文</a><img src ="http://www.aygfsteel.com/jorwen/aggbug/29416.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/jorwen/" target="_blank">方佳?/a> 2006-02-01 11:48 <a href="http://www.aygfsteel.com/jorwen/articles/29416.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> վ֩ģ壺 <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ӱ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ʵ</a>| <a href="http://" target="_blank">Ƹ</a>| <a href="http://" target="_blank">ӳ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">˶</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">żҴ</a>| <a href="http://" target="_blank">½</a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">峣</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ȫ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ˮ</a>| <a href="http://" target="_blank">˼</a>| <a href="http://" target="_blank">౱</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ʩ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">̩˳</a>| <a href="http://" target="_blank"></a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>