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

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

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

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

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

×
提交后禁用提交按钮(大部分人都是这样做的)4 q! @. j$ G4 t) z% j; { / D, ]8 e# N: H如果客户提交后,按F5刷新怎么办?7 H8 ^" |2 T, G, c# v0 ?4 h 8 A+ J# Y" ~: G3 }9 V使用Session / r M% u* d$ i- U/ Q3 ^ A6 Z" S" H8 L1 e' y- w7 d8 K 在提交的页面也就是数据库处理之前:; ]9 x6 W, W# H3 a. p K& H& ^ O- L3 r$ W: K if session("ok")=true then/ Z# W9 i1 p2 C8 M9 ] response.write "错误,正在提交"9 y( A) ]8 a& h6 b8 q) ~. J% B! t response.end9 k0 C4 E/ I5 n9 s end if6 t* P7 b; y8 g0 I 1 C" I2 `1 {/ y1 d- H* B. Y 数据处理完后,修改session("ok")=false。 3 m& b* @9 H9 L( ~9 s9 J; l 4 X3 V$ W% o3 I, J数据处理成功马上Redirect到另外一个页面 6 s, ?$ O( v: @( n- L4 O/ M% f9 C( X1 P 操作后刷新的确是个问题,你可以使用跳转页面、关闭本页面,如果是有参数据条件来控制的,那就应该好做了,可以直接修改window.location的值,把参数全部改掉,这样就差不多了。 * n7 o* N5 a* |# f" o # W; Z3 ]' @2 w: p. U E; s缺点:简单地运用Response.Redirect将不再有效,因为用户从一个页面转到另一个页面,我们都必须用客户端代码清除location.history。注意,这种方法清除的是最后一个访问历史记录,而不是全部的访问记录。 点击后退按钮,再点击后退按钮,你可以看到这时打开的是本页面之前的页面!(当然,这是在你的客户端启用了JavaScript功能的条件下。) 8 D( k8 L) Q6 H+ Y3 E" n $ M# c4 \* b) I. M. b" Q 如果客户按后退,怎么办? 8 C5 [; n6 `1 b. z1 t2 g. y* } 4 R0 l2 ?1 ~4 T9 X% P3 q- V防止网页后退--禁止缓存" V$ d+ \! B$ l0 n3 P 2 T7 w2 l O8 R+ Y$ Y( c( R1 ] 我们在进行数据库添加操作的时候,如果允许后退,而正巧有刷新了页面,就会再次执行添加操作,无疑这不是我们需要的,像一般网上很多禁止缓存的代码,有时并不可靠,这时你只要在操作的页面加上就可以了,在网页的里指定要定向的新页,再点后退,看是不是不会再退到刚才的操作页面了,实际上已经把这个历史给删除了 0 B% e' W% z8 h) ]5 t: i) r- o0 ?& K. O' ^ ASP:! m$ W h$ W) j* W1 P# p1 n Response.Buffer = True 9 Z$ U% _- \: f2 F Response.ExpiresAbsolute = Now() - 1 8 z7 s2 R; _0 V, IResponse.Expires = 0 6 |& d. I- D% q# G8 p Response.CacheC' U' S% o9 b2 G7 S3 }- u' i) r ) a+ r; j: I. `, h [8 k: m ASP.NET:. `) f6 d& I2 _) [4 f% a Response.Buffer=true;; B8 D/ d$ b; i Response.ExpiresAbsolute=DateTime.Now.AddSeconds(-1); F+ G+ Y* g8 I0 q: X Response.Expires=0; ?2 Y1 H4 P% t Response.CacheC; . u+ Q$ [( H: U0 h6 B$ H5 g" Z' c0 { 究竟怎样才能"禁用"浏览器的后退按钮?或者“怎样才能防止用户点击后退按钮返回以前浏览过的页面?” & l1 c) f; z; r, d9 r( L6 | 8 J/ G# T( _: U& D0 Y遗憾的是,我们无法禁用浏览器的后退按钮。# r0 y" S/ C4 j5 ~ . _- Y- J1 a5 f# ?' c6 j4 V防止网页后退--新开窗口 4 ?9 d% ]" u* B5 [5 q6 K- P( k5 N! ]: F1 k+ m; C# x 用window.open弹出表单页面,点提交后关闭该页;处理提交的ASP页也是用弹出,设定表单的target,点提交时window.open("XXX.asp","_blank"),然后用JS来提交表单,完成后window.close();* x/ ^2 B3 n H 简单的说,就是提交表单的时候弹出新窗口,关闭本窗口。对于window.open()打开的窗口怎么后退?能后退到哪里去?( u9 Y$ C: Q' s, f- G; U & C8 c" \, W" C( g/ Q4 A/ { 又一个新方法,放在ASP页面前面就可以了,其他如JSP也可以仿照一下~~ : [" w5 g) ~0 _( w: ^4 Q2 W* G) l3 G# E7 ~6 W) k: c; M+ c <%9 A6 S% r- @0 b& k* `5 W dim RefreshIntervalTime ( ^+ q6 t( w, p1 N0 bRefreshIntervalTime = 3 '防止刷新的时间秒数,0表示不防止2 b0 s3 C. T2 z! w If Not IsEmpty(Session("visit")) and isnumeric(Session("visit")) and int(RefreshIntervalTime) > 0 Then # P% N ^: @- z* ]/ [if (timer()-int(Session("visit")))*1000 < RefreshIntervalTime * 1000 then4 B. j! S/ {1 Z& L2 M Response.write ("<meta http-equiv=""refresh"" c"& RefreshIntervalTime &""" />") Y4 V0 o! N# t k! g) ~- T/ p9 u Response.write ("刷新过快,请稍候")$ {; _- x& {6 ^" Y; f6 Y Session("visit") = timer()" F% |9 V6 |- y& e Response.end 4 D" y+ A& Y- M0 U t8 F4 i3 rend if 3 u* l& [+ H# }* BEnd If / i9 X1 f! r. e: C4 h, |; gSession("visit") = timer()6 l$ ]2 `2 J3 l; J1 L %>
遨海湾-心灵的港湾 www.aosea.com
 楼主| 发表于 2008-1-9 10:11:00 | 显示全部楼层

5秒内不能刷新本页

<% % B- t$ a" X W& M9 B. C if DateDiff("s",session("time"),now())<5 then : H0 C9 [: h- l- z response.write("<script>alert('不能在5秒内重新打开此页');</script") 9 `3 a4 F, V! L. }# J( g else 0 g) `. [! p2 Z" S session("time")=now(); ) H& D) x8 D( I+ p+ A7 u end if 4 J& N5 ^8 }+ n: G' z5 u* E1 h %>
遨海湾-心灵的港湾 www.aosea.com
回复

使用道具 举报

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

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

用ASP.NET开发的人对服务器端控件事件引起的页面刷新很头痛吧! * \* S7 d9 Q" }7 g! W! a2 k , ^6 [/ V- g- e5 i! e7 a- ^ 0 p& F! G6 D* N4 i6 `$ l3 | 7 O8 D, s9 s$ v 我把解决问题的方法拿出来与大家共享,思路是事件执行完后写段脚本,让页面自动滚动到刷新页面之前的控件处,减少页面刷新 ! \! v* {+ m0 e. r/ I 带来的不便。 2 R) S9 ]5 U7 p3 d: c! _. K 3 w! y( A: o# s" m 比如按了一个按钮后,脚本会自动将页面自动滚动到这个按钮的位置。 5 X: ?. q$ u/ h' s7 M" @6 x4 Y2 Q 0 i" c0 G6 a% R# p$ | - f- b% v% }+ t! q8 b 7 z9 E2 L( n2 }9 } 写段脚本的事情,用了一个ScriptHelper的类来搞定,这个类有个GetViewControlScript(string controlName)的方法,它返回是 + ~( j. {0 b: P+ {" V( K 一段客户端的脚本,传入的参数就是这个控件的ID。 $ A1 O+ i" G) p9 v+ G* d) G# B ScriptHelper类代码: % |. t. F5 |3 y- a, @8 S /// <summary> 9 g) v) D; {9 l/ S- m% Y /// 提供一些产生页面脚本的方法 7 Q$ Z8 E' \4 B9 g8 K, Q8 }0 R /// </summary> 9 D: o- I( n! v public class ScriptHelper ; t7 }1 s# ^4 u5 [ { ) ?" [. ~1 s$ @2 l- G0 C P' b5 G& z8 F  /// <summary> 2 @# P* [, r' W( K. M) v2 Z7 N  /// 获取客户端查看控件的脚本 7 N4 i- b& i, g6 d+ E: M+ b  /// </summary> 5 B% ^3 ~$ D5 I  /// <param name="controlName"></param> . x {% S' C: K' ]7 N. `. a/ `1 v  /// <returns>脚本代码</returns> ( [3 R3 T; _, v# c% B+ O+ U. F  public static string GetViewControlScript(string controlName) 9 {# p( |3 ^0 j6 y/ h, ?  { 4 W9 V* J* w3 i% Z: _1 m% c7 u & M' n! n9 s* c) p   //创建客户端函数ViewObj 3 A; G. G& ?: O- _/ B   string script = "\n"; - Y) c8 l8 X0 | f   script += "<script language=\"javascript\">\n"; ; g; n$ k8 {& @! Y$ b   script += "function ViewObj(objName)\n"; 4 d9 [$ ^ w) b' T% ^   script += "{\n"; 2 q% Y& K, o/ P; w! e! G" n, q   script += "var obj = document.all.item(objName);\n"; 6 I% b* M) B+ A4 g; Q& B   script += "if (obj != null)\n"; : t2 b. C3 k4 K6 k   script += "{\n"; 9 C! Z! u& E7 G& l, T- M   script += "\tobj.scrollIntoView();\n"; ' v) f/ d9 p* u: Z0 U# O; I7 q$ g$ x   script += "\tobj.focus();\n"; ( _! C! J0 O. T( c% N- g   script += "}\n"; . x H9 _# u7 \1 b# w/ p   script += "}\n"; 1 b) B/ p5 o6 P( {( x. }: R 5 |+ ?0 V2 s9 I //创建客户端函数ToDo , S4 H6 M6 u: z0 g6 B' ]! {- p   script += "function ToDo()"; ; q0 H. Q# Y3 A! s0 R; g: V' V   script += "{\n"; ; y" r4 y* d7 _. H   script += string.Format("setTimeout(\"ViewObj('{0}')\",1000);\n", controlName); ( Z) _' w$ g# t' T. a/ i   script += "}\n"; ! ^, z) G# y: U; W U0 Q4 D - d& S1 h0 Z7 d2 _9 y   script += "window.onload = ToDo;\n"; - `, f# l1 W0 b& q! x   script += "</script>\n"; 2 p9 x R& j% V: D Z& j2 ^; n* b: U, l 8 E; g& f4 T1 z0 S& Q   return script; 2 B0 s* J! c0 N+ ~4 B1 @, Q  } ; o, s) V+ M: h4 D0 s; q / E3 n9 v; X8 R% \5 Q i1 @5 ~ } 9 y* y' k: N3 s5 ?( v* V/ |3 p 8 U5 o: p- h3 \- a. z0 p: ~ 使用示例: 5 B5 i( S8 h; g5 v1 |9 q* ^ % M# ~4 \+ q* F, u0 W* F) { 为了方便输入脚本,我在页面上放了个Label:lblScript,并把lblScript的EnableViewState属性和Visible属性设成False。 ) ]3 u8 H0 Z9 P/ a , c; \% \/ P) _6 C/ F, W. j 然后在lblScrpt的Click事件的操作代码后添加输入脚本的代码,如下所示: % r9 `5 h- s5 w1 @ private void btnSave_Click(object sender, System.EventArgs e) 2 D: x0 i' M% C { 1 U* E, _4 n& k7 R' d/ B% H" t) v project.UpdateProjectInfo(ds); 3 B! y+ R! J0 P) e lblScript.Text = ScriptHelper.GetViewControlScript("btnSave"); 7 P: f1 W0 T/ P$ d } 1 S' G$ o7 g; f$ c$ t1 }2 d / c5 }2 i+ y9 i" e1 n 在点击btnSave按钮后,页面会自动滚动到btnSave的位置,减少了页面刷新带来的不便。 I" a7 h' y7 A F :+ 5 k4 b. k; X* B4 @+ m) p- k 或者: 1 X, e Z6 h G+ ?7 G+ @# f F/ h' [. p$ T: f+ W0 u在page_load()中增加判断 ' f. C$ _5 T9 i# v, c1 _( L c3 S4 N if(!Page.IsPoastBack) 2 K* r6 y8 T! O3 f( j8 w6 s { ) Z: l5 j8 C2 u4 u9 f/ o. p9 r //初始化页面内容; * y+ X* b; Z! Z, U6 [ }
遨海湾-心灵的港湾 www.aosea.com
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2025-5-15 09:26

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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