Rubycas的登录在Firefox下没有问题,但是IE下会重复提交表单(post 数据两次),IE6下正常,IE7下偶尔正常,IE8下是一定提交两次。
Rubycas服务端cas.rb文件中validate_login_ticket(ticket)方法片段如下:
lt = LoginTicket.find_by_ticket(ticket) if lt.consumed? error = _("The login ticket you provided has already been used up. Please try logging in again.") $LOG.warn "Login ticket '#{ticket}' previously used up"
它是先到casserver_lt表中看consumed字段是否有值,这个值是在post时候填的,所以连着post两次的话,第二次consumed肯定有值,就会一直警告The login ticket you provided has already been used up. Please try logging in again.
1.刚开始看到网上的方法说可以在form标签的 οnsubmit="getElById('submitInput').disabled = true; return true;('submitInput'为提交按钮或图片的id),经测试,只有我改了view.rb的源码,重启rubycas服务后才能生效(也就是只提交一次表单),但是以后的登录都还是提交两次表单,即只生效一次。
(原文地址 http://www.ms-news.net/f688/ae-c-ae-aeu-e-cs-ae-aeoe-e-i-y-6241629.html
)
2.然后又看到说IE缓存机制是提交表单如果检测到参数和上一次相同,就使用缓存中的数据提交,于是我在表单中添加了一个隐藏参数:
input(:type => "hidden", :id => "random", :name=> "random-submit", :value => rand(10000))
这样修改后,每次第一次登录还是会报错The login ticket you provided has already been used up. Please try logging in again.
但是再登录一次又正常了,很是奇怪,其实表单还是提交两次的。
3.最后找到的解决方法居然异常的简单,就在submit()后加个return false就可以了。如:
document.formname.submit();
return false; //加上这个可以确保不会重复提交
(解决方法参考 http://www.diuwo.com/blog/?action=show&id=20)
-------------------------------------------------------------------------------------------------------------------------------------------------------
附原文 “IE下使用form表单提交到iframe中出现的重复提交问题”
被这个搞的头很大,最终找到原因,问题还是出现在form表单上。
如果你的form是这样写的
<form name="formname" action="topage.php" method="POST" target="ifamename">................
那就会出现这种问题。这个问题所在就是在一开始在from定义中就加了action和target属性。
解决办法就是把这两个移开,等真正提交时,再赋给它这些属性的值。
可参照如下代码:
<form name="formname" οnsubmit="document.formname.action='topage.php'">.......<input type="buttion" οnclick="return check();return false;"></form><iframe name="iframename"></iframe>
然后在check()函数中检查完表单符合提交时再调用document.formname.target="iframename";document.formname.submit();这两句
如:
<script language="javascript">
funcion check() {
.检查如**不能为空;
......
document.formname.target="iframename";
document.formname.submit();
return false;//加上这个可以确保不会重复提交
}
</script>
这里两个加红的reurn false可以确保避免重复提交的问题
类似问题就可解决。。。