找回密码
 入住遨海湾
搜索
网站解决方案专享优惠-3折上云
查看: 1844|回复: 2

网页防刷新重复提交、防后退解决方法

[复制链接]
发表于 2008-1-9 10:09:00 | 显示全部楼层 |阅读模式

登录后查才能浏览下载更多咨询,有问题联系QQ:3283999

您需要 登录 才可以下载或查看,没有账号?入住遨海湾

×
提交后禁用提交按钮(大部分人都是这样做的)( M2 V" _2 h+ h" u# L$ a8 G% R 1 h% d, l. _! p 如果客户提交后,按F5刷新怎么办?1 X$ g1 `, o9 P! ?2 P6 b, D" p; S " m# ~2 b2 r( T+ ~1 ?8 L8 a3 @使用Session! ~4 Q4 e/ D p / u; P& Q5 ]' L% Q* w- o/ T 在提交的页面也就是数据库处理之前:: j' C6 B+ [& t- C8 @: x( X 0 Y* C$ X) l" r0 t Hif session("ok")=true then+ L0 c3 I$ `* l; D4 x response.write "错误,正在提交" . p, k* @8 i$ r, m$ t response.end" j; d) N( R- V0 Y end if $ x+ t& P- Z) \+ F& T/ J) f. s9 g4 h* v 数据处理完后,修改session("ok")=false。 $ K% ?8 } {% Y 4 Q1 k- R4 n7 C. |* c2 L数据处理成功马上Redirect到另外一个页面. x. s8 u2 E0 y" E" _5 } 4 ]1 |& H$ s/ H操作后刷新的确是个问题,你可以使用跳转页面、关闭本页面,如果是有参数据条件来控制的,那就应该好做了,可以直接修改window.location的值,把参数全部改掉,这样就差不多了。 ; }6 p0 _7 q4 x; l 7 |7 m& K m! D3 u$ z缺点:简单地运用Response.Redirect将不再有效,因为用户从一个页面转到另一个页面,我们都必须用客户端代码清除location.history。注意,这种方法清除的是最后一个访问历史记录,而不是全部的访问记录。 点击后退按钮,再点击后退按钮,你可以看到这时打开的是本页面之前的页面!(当然,这是在你的客户端启用了JavaScript功能的条件下。) 2 s c5 D* g/ t, @ ! B+ C, |% B9 w, s" j 如果客户按后退,怎么办? 8 |' [6 p: `/ C6 ?- X; p' Q ^- L- C3 L8 ]& g, A7 H: w 防止网页后退--禁止缓存' g: X( U" \4 Y7 d7 ^0 o' V3 U : W3 U6 Z# E0 g0 T 我们在进行数据库添加操作的时候,如果允许后退,而正巧有刷新了页面,就会再次执行添加操作,无疑这不是我们需要的,像一般网上很多禁止缓存的代码,有时并不可靠,这时你只要在操作的页面加上就可以了,在网页的里指定要定向的新页,再点后退,看是不是不会再退到刚才的操作页面了,实际上已经把这个历史给删除了 2 C1 x% R- J- A7 r9 Y/ U! B1 N - N- ]# m1 l* m1 R& X" DASP:: ~) e' w/ R+ K2 n! g: s Response.Buffer = True ( p4 t- l/ `3 T! d3 l0 T5 m, p" K6 u Response.ExpiresAbsolute = Now() - 1 i' `1 v- p6 V# }Response.Expires = 0 : w' z, u' h1 W7 [9 z# y Response.CacheC* A" |( d0 ]0 w9 |2 H! U/ _ ! F" ]8 _: Z( A# T" S8 UASP.NET: $ R7 h( P6 H# {Response.Buffer=true;$ V9 h$ j ~# l0 n Response.ExpiresAbsolute=DateTime.Now.AddSeconds(-1); / y: Q' P1 n: B% c3 ^% w+ }4 }! `Response.Expires=0; b- n' n3 H; T# J1 a7 p; w$ C$ I Response.CacheC;& Z6 `( S3 I3 I9 ^' O : e1 a: a# W }究竟怎样才能"禁用"浏览器的后退按钮?或者“怎样才能防止用户点击后退按钮返回以前浏览过的页面?” 6 Z( ?/ W5 U+ Q* Q. i$ o/ C$ q2 _& h- A( y+ s: N/ l 遗憾的是,我们无法禁用浏览器的后退按钮。 3 ~& d3 W5 t' L( L/ V* H4 U6 H, W! p# M* m# u1 S! j 防止网页后退--新开窗口9 I0 t5 h; {; j$ m. ?; W% f$ X+ R* f - O2 o7 \; G6 Z: K3 c1 } 用window.open弹出表单页面,点提交后关闭该页;处理提交的ASP页也是用弹出,设定表单的target,点提交时window.open("XXX.asp","_blank"),然后用JS来提交表单,完成后window.close(); 2 c9 q& X& \! h S: W简单的说,就是提交表单的时候弹出新窗口,关闭本窗口。对于window.open()打开的窗口怎么后退?能后退到哪里去? 4 G' ~$ }! U9 X8 `" P& ^5 _- u3 }+ d! r( X 又一个新方法,放在ASP页面前面就可以了,其他如JSP也可以仿照一下~~ 2 S5 [& U9 i5 Q+ @( i( v4 x# Q! K9 ?1 f; J( | <% 5 J. ]9 i5 o5 Qdim RefreshIntervalTime6 x* i9 m- w3 A% c+ V+ t8 c RefreshIntervalTime = 3 '防止刷新的时间秒数,0表示不防止; v; W" c$ U. H W7 R If Not IsEmpty(Session("visit")) and isnumeric(Session("visit")) and int(RefreshIntervalTime) > 0 Then + m' x; Z) Y$ R- w2 k. mif (timer()-int(Session("visit")))*1000 < RefreshIntervalTime * 1000 then. y: ~2 M1 P$ P Response.write ("<meta http-equiv=""refresh"" c"& RefreshIntervalTime &""" />"): F7 y& l, _6 i6 ], I0 E. k Response.write ("刷新过快,请稍候") : |5 M+ {9 Z4 w8 U6 ]8 V Session("visit") = timer() , @' g2 e2 \2 |; [5 |* p Response.end4 w( _* X# Y/ ^( p; P end if0 \- x: V [( D& t1 n End If : I( Y4 b3 r" s" OSession("visit") = timer()7 M7 \/ U' `( C) P! l7 j %>
遨海湾-心灵的港湾 www.aosea.com
 楼主| 发表于 2008-1-9 10:11:00 | 显示全部楼层

5秒内不能刷新本页

<% - X0 r1 U$ }* }7 l if DateDiff("s",session("time"),now())<5 then 3 [, E5 V2 O3 b3 m& ] response.write("<script>alert('不能在5秒内重新打开此页');</script") 9 S" \) \0 S* t else 9 G2 |/ \' E% f! m+ G1 A session("time")=now(); $ j: l0 n4 ]7 p! \# W. J. k6 O* I end if ; A7 P1 o& h+ H! _5 d' c c %>
遨海湾-心灵的港湾 www.aosea.com
回复

使用道具 举报

 楼主| 发表于 2008-1-9 10:14:00 | 显示全部楼层

回复:网页防刷新重复提交、防后退解决方法

用ASP.NET开发的人对服务器端控件事件引起的页面刷新很头痛吧! ! E8 c H( h5 @) s8 s2 G ' s% ^& e7 j6 B ) Y+ ~ |: ?& \- J 3 X. x; a! ^6 ^! [# s 我把解决问题的方法拿出来与大家共享,思路是事件执行完后写段脚本,让页面自动滚动到刷新页面之前的控件处,减少页面刷新 - v; ?& L# d _% w( Y 带来的不便。 7 H/ M0 L/ ~$ g G4 U1 _$ S 8 ]4 b0 U4 O* q6 E" E; n 比如按了一个按钮后,脚本会自动将页面自动滚动到这个按钮的位置。 ( c% R" B* G0 h# k1 W: D 8 q+ i, C: o* ~/ \' N ; Y; X% j) P$ C - d" X, |2 @1 n3 V! p 写段脚本的事情,用了一个ScriptHelper的类来搞定,这个类有个GetViewControlScript(string controlName)的方法,它返回是 9 Z" V2 k* z* p3 N1 }+ s: }9 h# } 一段客户端的脚本,传入的参数就是这个控件的ID。 ; h% f6 r0 S7 N& K# C ScriptHelper类代码: ' W; W( ~2 p) c7 M$ j; y) v9 J /// <summary> . M1 U; a* S. F, C9 H* h /// 提供一些产生页面脚本的方法 & S: f+ a* L" Z4 B3 r /// </summary> 7 _* I8 m6 ^5 Y0 C" L$ s! L0 B public class ScriptHelper . K' M4 p6 R# X- ] { 2 T/ n3 i1 s4 a) I/ p: }3 ] $ Y3 G+ F. C* g! x  /// <summary> 8 ], I0 B+ |. ]! c! v  /// 获取客户端查看控件的脚本 4 }+ i3 X" k- S, D* o& X  /// </summary> * Y. i$ D |7 Q; X: M! _- r- {/ N$ ^  /// <param name="controlName"></param> + X. l3 d3 ~1 E, t5 a  /// <returns>脚本代码</returns> " Q1 q' w1 I' r% q3 i1 {  public static string GetViewControlScript(string controlName) $ q& U! J/ `& I$ Q' Y5 B  { 0 E3 e/ x. z9 t0 \# A5 Q# q2 S " X9 m$ d8 v; e1 j- X7 L) A" }& Y   //创建客户端函数ViewObj 3 x+ ^/ G) w/ i6 S9 S   string script = "\n"; 1 h: B5 q7 A+ B% j5 d   script += "<script language=\"javascript\">\n"; * V+ V; C. H0 a$ v7 }: k6 b   script += "function ViewObj(objName)\n"; # _( k4 O5 y M) p! ?% k6 G% p+ e   script += "{\n"; ) v0 \3 ?+ b* }. v7 w   script += "var obj = document.all.item(objName);\n"; 1 h$ C, w6 E) A   script += "if (obj != null)\n"; 3 f4 t6 X( B! Q6 G   script += "{\n"; 5 Y: k- K9 v1 `6 Z1 u   script += "\tobj.scrollIntoView();\n"; ! w3 @- ?+ P c& E- I. k. E   script += "\tobj.focus();\n"; 6 j- ]% v0 p# @5 \: R1 e5 S   script += "}\n"; 5 h5 ^" q6 S, P+ N   script += "}\n"; $ y; O- A' s" C; B" o6 ~. I' q0 S# G 4 a) s8 r5 f* `) `# _% e) C; B //创建客户端函数ToDo ' F5 m6 ?' y$ j( D/ x5 R V) w   script += "function ToDo()"; ' Z3 S. C$ d- k* g   script += "{\n"; 3 N# U; `/ T$ p* N" d2 o   script += string.Format("setTimeout(\"ViewObj('{0}')\",1000);\n", controlName); - y& {! M/ Q! q3 O# ]$ B% O: [   script += "}\n"; . s1 g# @) F5 P! E# c" {& e 5 ^, Z3 o0 V( a$ s5 x6 T   script += "window.onload = ToDo;\n"; 4 [7 P4 L2 G- B9 \1 H& G   script += "</script>\n"; ' i2 o0 s$ c, | J % _7 i/ _) ^& v   return script; 1 J# u' j2 U- I# C  } 4 I4 p5 x' y) ]) Z, f : ~/ i5 `" X3 ]4 a" F2 ] } 3 k8 a5 d0 U7 e2 N8 Y * g3 ] x8 f, X8 X3 p$ v; { 使用示例: 8 @ Q4 J1 W4 l , W+ {" _1 K+ h# ~ 为了方便输入脚本,我在页面上放了个Label:lblScript,并把lblScript的EnableViewState属性和Visible属性设成False。 5 ^6 b. X9 I9 g( }1 O# J' H4 k * g2 Q5 [' `/ e% `0 T 然后在lblScrpt的Click事件的操作代码后添加输入脚本的代码,如下所示: 2 F6 q+ R. | v6 j" A- | private void btnSave_Click(object sender, System.EventArgs e) ' ?2 U/ S1 i/ f( u! i% _ { ( s8 T" S L/ W2 ?7 P project.UpdateProjectInfo(ds); ( `1 O' m/ {% \: Y lblScript.Text = ScriptHelper.GetViewControlScript("btnSave"); 4 h3 \3 W0 \9 ~1 c } 1 i! u# E5 F1 H # m* d% U! E h: p, ? 在点击btnSave按钮后,页面会自动滚动到btnSave的位置,减少了页面刷新带来的不便。 2 H7 z8 a$ A* C3 y :+ 5 `0 @/ {% p2 D7 k6 i1 s- M3 ~0 U 或者: + ?5 a. o5 a0 y 0 o; j# T+ r0 N" S# C. ]: T在page_load()中增加判断 * U) A3 z5 N3 u if(!Page.IsPoastBack) 9 Z+ r# K7 Z+ z$ @ { 3 }) I/ [0 q; h //初始化页面内容; 6 o V1 w* ? }' I }
遨海湾-心灵的港湾 www.aosea.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 入住遨海湾

本版积分规则

网站解决方案专享优惠-3折上云

QQ|手机版|小黑屋|遨海湾超级社区

GMT+8, 2025-4-25 05:34

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表