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

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

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

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

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

×
提交后禁用提交按钮(大部分人都是这样做的)7 {3 {! [+ c4 x8 x7 w8 N# M3 } - m( v# J& F e E. a如果客户提交后,按F5刷新怎么办?& f* L/ E% f( O* |( Q. c& e4 G 7 j- E2 g( N3 z( V/ V- y使用Session 1 Z `" F) W U6 J9 z+ b: ?! ?6 U" [! x5 r 在提交的页面也就是数据库处理之前:( C2 Y# k& }% u6 K) G7 x ) Z X! b0 n) O: |# W- N2 v if session("ok")=true then ( v9 ~* m$ E2 o" a' f response.write "错误,正在提交"$ h+ z ?3 Y! ]! `4 V/ [ response.end " @, i7 W7 A- ^+ O4 L1 Dend if% y2 K! X8 o* R- \; b S " S' Z5 ]0 h9 s( z+ H( m% w. w1 \ 数据处理完后,修改session("ok")=false。 6 H9 i+ \) }9 t$ m: G . E' e6 J2 W& B# ]( |. r, l数据处理成功马上Redirect到另外一个页面! K w8 ?0 ~8 E1 M 3 _4 N: w' B6 @操作后刷新的确是个问题,你可以使用跳转页面、关闭本页面,如果是有参数据条件来控制的,那就应该好做了,可以直接修改window.location的值,把参数全部改掉,这样就差不多了。 ) _0 _- |: j0 ]: F3 Q% O 4 W5 \, A4 ]6 b% Q7 L. r6 w缺点:简单地运用Response.Redirect将不再有效,因为用户从一个页面转到另一个页面,我们都必须用客户端代码清除location.history。注意,这种方法清除的是最后一个访问历史记录,而不是全部的访问记录。 点击后退按钮,再点击后退按钮,你可以看到这时打开的是本页面之前的页面!(当然,这是在你的客户端启用了JavaScript功能的条件下。) $ ~# j8 K& B: L# R( {! X: u. ^" Z$ n 3 Y0 v! d8 r/ A, n* A. K' C如果客户按后退,怎么办?* z$ a4 m- R6 F! R 3 Y; ?+ R2 c& _3 \# C: d3 ? 防止网页后退--禁止缓存 4 L" i" B9 ^, I! O3 h! D 3 j x$ q5 C/ V+ c2 `( r" V6 ~/ Y9 O我们在进行数据库添加操作的时候,如果允许后退,而正巧有刷新了页面,就会再次执行添加操作,无疑这不是我们需要的,像一般网上很多禁止缓存的代码,有时并不可靠,这时你只要在操作的页面加上就可以了,在网页的里指定要定向的新页,再点后退,看是不是不会再退到刚才的操作页面了,实际上已经把这个历史给删除了 5 ~1 |7 r' C- M; B " e( u9 B9 l; ?) lASP: ' ?- x: N, f% LResponse.Buffer = True & ^8 {- q. d1 W0 B: P5 MResponse.ExpiresAbsolute = Now() - 1 * u, V) O- ^/ w. i! x! r Response.Expires = 0 ' {$ i8 @9 L* N7 Z4 L0 OResponse.CacheC0 a6 n3 J) ^2 ^ - T1 C6 F0 f! t9 { ASP.NET:' ^2 F" i" }& Z$ }8 T Response.Buffer=true;8 b: S' N6 [, x5 u, Y Response.ExpiresAbsolute=DateTime.Now.AddSeconds(-1); 2 }! R* ]2 P, q8 iResponse.Expires=0;9 S' M6 G# ?# m Response.CacheC; 5 u3 k5 Z( |: O+ p# m . @ E6 M4 Y4 X究竟怎样才能"禁用"浏览器的后退按钮?或者“怎样才能防止用户点击后退按钮返回以前浏览过的页面?”- C7 t& A( u# e1 h+ y7 V 3 Q2 Q; }. h3 h, Q 遗憾的是,我们无法禁用浏览器的后退按钮。 " g8 [, I* R, R# @8 o2 v# N+ c4 Z5 b: b# Y- k5 z! x3 ]) \' j9 e7 `2 e 防止网页后退--新开窗口 5 o* w; n2 e# }* R' v2 X : z* O) R/ `1 a% a, X用window.open弹出表单页面,点提交后关闭该页;处理提交的ASP页也是用弹出,设定表单的target,点提交时window.open("XXX.asp","_blank"),然后用JS来提交表单,完成后window.close(); " X# V- B: ^; v5 ?# C V- h. L" G简单的说,就是提交表单的时候弹出新窗口,关闭本窗口。对于window.open()打开的窗口怎么后退?能后退到哪里去? . R& M5 X# b6 O : @- V& t: e1 h- t又一个新方法,放在ASP页面前面就可以了,其他如JSP也可以仿照一下~~ 0 O9 C9 s0 o3 l3 @" m9 v, }0 s+ q4 J8 Q/ i9 i# |$ s' q9 L <% ) \( n( w% z" c( R% \1 ?dim RefreshIntervalTime 3 ?3 X! z& f$ E* _" \' DRefreshIntervalTime = 3 '防止刷新的时间秒数,0表示不防止 " v( C5 y8 R9 I9 r7 m$ p, jIf Not IsEmpty(Session("visit")) and isnumeric(Session("visit")) and int(RefreshIntervalTime) > 0 Then* k# ?* H/ i/ U' y if (timer()-int(Session("visit")))*1000 < RefreshIntervalTime * 1000 then( u0 W, f7 p0 M. b9 R% G1 y Response.write ("<meta http-equiv=""refresh"" c"& RefreshIntervalTime &""" />")! \! b% s$ B! ~" { Response.write ("刷新过快,请稍候")5 U5 w( b" n: p" G4 o' U5 v Session("visit") = timer()( V7 F0 J4 ]( d4 \5 j7 m; U/ ` Response.end * ~4 k0 Y* \2 V. H! |# h9 Jend if/ R9 C" y; h# Y; \5 C- j9 s End If7 Z2 @' W' }$ k1 B$ i Session("visit") = timer() 4 X) N+ a) E0 A$ e! r( V3 O9 ~%>
遨海湾-心灵的港湾 www.aosea.com
 楼主| 发表于 2008-1-9 10:11:00 | 显示全部楼层

5秒内不能刷新本页

<% 2 h+ w+ I! B8 q+ I0 F% C+ A if DateDiff("s",session("time"),now())<5 then % M- x. I- B. b) x8 \; }; B response.write("<script>alert('不能在5秒内重新打开此页');</script") ! ~5 G: G2 a3 w! k5 f( q' o g1 t else 7 f+ `& ?9 ?9 o. ^9 f6 L- P4 d+ x session("time")=now(); 9 M t5 m- l) c& Q; Z end if / W6 N0 a1 m2 t- j/ `7 O %>
遨海湾-心灵的港湾 www.aosea.com
回复

使用道具 举报

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

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

用ASP.NET开发的人对服务器端控件事件引起的页面刷新很头痛吧! 3 [. o, H0 n" ^1 [6 J " X$ \) d4 G( v8 V( ^1 j 4 i) J6 \- j; Z9 h& v2 S 0 }0 S; E$ O/ s 我把解决问题的方法拿出来与大家共享,思路是事件执行完后写段脚本,让页面自动滚动到刷新页面之前的控件处,减少页面刷新 0 _7 f/ g4 T* T4 @: j& C1 C/ Q 带来的不便。 ' z+ L$ ^# {. v / B; l1 j. I/ _4 R+ A 比如按了一个按钮后,脚本会自动将页面自动滚动到这个按钮的位置。 , X. [+ h) a% W. j " m$ i2 T% b5 T0 A# s7 Z1 X / i0 t6 `3 o4 m; R0 ^. Z 0 z, g/ s* R3 C$ o+ J* i1 p6 z C0 ] 写段脚本的事情,用了一个ScriptHelper的类来搞定,这个类有个GetViewControlScript(string controlName)的方法,它返回是 : q$ E+ A" ^' K1 \; Z# Z 一段客户端的脚本,传入的参数就是这个控件的ID。 1 G* {# ^$ H* J ScriptHelper类代码: $ A- }& U$ q. A5 ^3 o; l2 t" k9 e' V /// <summary> ; y9 a- X! y1 h /// 提供一些产生页面脚本的方法 ' ?) @2 z5 R( H" h /// </summary> 3 v! R2 N$ o9 v0 M public class ScriptHelper 7 }$ N# B$ B- ]' }4 _' o+ G { 5 f: l- g& j0 H, I / X9 |0 s2 ^- S! V  /// <summary> ' o: n8 A3 F4 v, t5 z$ O3 ~" m  /// 获取客户端查看控件的脚本 ( |# ^2 B9 A; l/ P  /// </summary> 4 g3 q2 ~+ m7 h  /// <param name="controlName"></param> # m! Q0 I( ]: H" V  /// <returns>脚本代码</returns> 2 |* }' u% ]+ M+ |0 J+ g* \  public static string GetViewControlScript(string controlName) 0 x% q$ i$ f( X- E5 q' @4 o( n  { ! R6 I% u- [9 F8 N Z # A1 K9 O9 h* U5 n. M   //创建客户端函数ViewObj & y( f# D. p: O7 Q8 n   string script = "\n"; " E0 L5 Q: Y+ J4 Z   script += "<script language=\"javascript\">\n"; ) w2 e2 V4 D8 X, A S( q   script += "function ViewObj(objName)\n"; 0 B! K, k% |1 j; z2 N$ C   script += "{\n"; : I% I& F5 R9 o/ \7 I% y   script += "var obj = document.all.item(objName);\n"; : G4 t' F+ @! M( d* \6 C   script += "if (obj != null)\n"; " d6 {! b* o2 i z/ d9 _   script += "{\n"; : L# c0 ?5 X; n/ w, w* K   script += "\tobj.scrollIntoView();\n"; 0 F: C( Z, s6 e% i+ x) X   script += "\tobj.focus();\n"; 8 R- E& A8 p8 @9 Z6 z# s# K   script += "}\n"; ) e# ]& w, J- \4 }! g' M   script += "}\n"; - G, j/ s3 y6 g. v! `# U4 S X1 C1 m) B, F' w' Q# w( a" Y //创建客户端函数ToDo 3 J9 h" B A) }   script += "function ToDo()"; . \+ [" `4 }. P$ K& U K0 c: O   script += "{\n"; * P; Q; l/ ~: p   script += string.Format("setTimeout(\"ViewObj('{0}')\",1000);\n", controlName); 4 j" j( K f$ p6 x   script += "}\n"; 3 S5 C- ^* v. [( f+ e+ [ ! R2 I: t& r* g* N0 e- }; Z   script += "window.onload = ToDo;\n"; ( A5 m4 ~8 ]4 f' {: @% A4 B/ U   script += "</script>\n"; . n) ^6 U |1 ~, C + o5 I) L9 A5 l4 {4 s O o0 b3 z   return script; 3 Z) S$ [8 ?( W6 n, D; P3 n  } 3 ]. o7 q( |0 e$ F ) {8 o) U! P) R } 7 ]4 E- a* w: E: `6 O+ J ! o- p( B* q+ m8 ^) S* ? 使用示例: 6 |! D6 ]# m0 }- _% p w 4 C+ w, w9 X, E& Y! V( n 为了方便输入脚本,我在页面上放了个Label:lblScript,并把lblScript的EnableViewState属性和Visible属性设成False。 , c ?6 @2 o2 I; @5 r 5 ]3 l8 c# W; L 然后在lblScrpt的Click事件的操作代码后添加输入脚本的代码,如下所示: " ?, z+ `* l( k$ o& q0 W; d$ o; _ private void btnSave_Click(object sender, System.EventArgs e) 7 C' ~$ N2 ]5 [# r6 g8 e { 4 s# A) m- k) M& k% i project.UpdateProjectInfo(ds); - p& N8 g$ w$ L! J1 p3 [6 v% T lblScript.Text = ScriptHelper.GetViewControlScript("btnSave"); & L" a; \% x1 t# _) `! V. T" c } * Z7 `3 \" p" x/ u& [9 i9 v6 O $ u, R( A) I7 }& l0 ?! w! K8 m" { A 在点击btnSave按钮后,页面会自动滚动到btnSave的位置,减少了页面刷新带来的不便。 3 w8 L+ F u4 x9 I:+ 0 ^8 B) P/ c0 I! R( N& P& u! q: m 或者:% H: P) M) P6 ]$ I6 _ $ c$ @( H! y' o0 M# b' O在page_load()中增加判断 , W/ G: z8 i* B6 T if(!Page.IsPoastBack) ) J- o# Z. X( P G+ I/ } { & t9 C. Z$ _. {' L2 a1 _ //初始化页面内容; $ I% O* E$ f4 b, X }
遨海湾-心灵的港湾 www.aosea.com
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2025-4-4 23:16

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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