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

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

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

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

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

×
提交后禁用提交按钮(大部分人都是这样做的)9 T& ?9 ^$ ^" [9 S: k1 @ . U+ k* P" v& T4 ]6 O( C+ R0 ? 如果客户提交后,按F5刷新怎么办? . V+ ^ |( D* a6 Q# v' w% b; J0 e1 N+ b/ R 使用Session 2 m8 U- j4 X3 ]5 L' s$ i& ^9 U/ @0 L8 `. V' ]; c5 z+ H 在提交的页面也就是数据库处理之前: @% W/ C0 g: C0 g* A. n! D' l d1 y& B" P if session("ok")=true then + ?4 x9 e% f" T0 Y* `5 E response.write "错误,正在提交"& z* ], t/ o% [) c# s1 h response.end : U y: `/ K% f+ |9 _0 nend if ( r% E; R5 Y# \! s# Y$ Y% `9 V. S; d2 b$ Q F 数据处理完后,修改session("ok")=false。5 F) S' G7 }$ E 9 c- w% | G; i5 | ^; M 数据处理成功马上Redirect到另外一个页面 2 E2 g; t: k7 \0 a4 r3 M4 D * A* T! P+ f, m; S2 Y2 J操作后刷新的确是个问题,你可以使用跳转页面、关闭本页面,如果是有参数据条件来控制的,那就应该好做了,可以直接修改window.location的值,把参数全部改掉,这样就差不多了。 . O" D+ G' L5 x# c6 Q7 h: V7 |7 v) _; u$ ] 缺点:简单地运用Response.Redirect将不再有效,因为用户从一个页面转到另一个页面,我们都必须用客户端代码清除location.history。注意,这种方法清除的是最后一个访问历史记录,而不是全部的访问记录。 点击后退按钮,再点击后退按钮,你可以看到这时打开的是本页面之前的页面!(当然,这是在你的客户端启用了JavaScript功能的条件下。) # D% r3 p. l" O # Q2 j0 W! n/ S' E+ h 如果客户按后退,怎么办?4 ?, \$ s' I; F* ~- P& W7 S+ O ' d- U( q+ Y2 X) K防止网页后退--禁止缓存7 a: G. z7 m; q % M" p2 M [5 H5 |: J F 我们在进行数据库添加操作的时候,如果允许后退,而正巧有刷新了页面,就会再次执行添加操作,无疑这不是我们需要的,像一般网上很多禁止缓存的代码,有时并不可靠,这时你只要在操作的页面加上就可以了,在网页的里指定要定向的新页,再点后退,看是不是不会再退到刚才的操作页面了,实际上已经把这个历史给删除了 % K3 ]- k7 m- E & G- T Z& ]% E( a8 UASP:3 D8 }* }$ C) t! s m Response.Buffer = True ' Y+ X- F6 }' w$ OResponse.ExpiresAbsolute = Now() - 1 : v; T/ P% z" l$ z Response.Expires = 0 2 i- R4 g9 g# l) t1 W: @" k1 S Response.CacheC 8 I5 |- _6 G4 e2 J! v2 S7 J( S) U$ |& d# ? ASP.NET: , s7 `5 S& Y1 a4 U! GResponse.Buffer=true;/ j q" |5 S9 ], [- O/ B4 d+ ~5 H$ v P Response.ExpiresAbsolute=DateTime.Now.AddSeconds(-1); 0 _* j' `, c# H: R$ BResponse.Expires=0; - t \# t P. d4 y. s* c7 @) U( yResponse.CacheC;: S2 F9 `# U8 ` 6 R$ _, A: j/ z, [( f& I8 m9 P) g! x究竟怎样才能"禁用"浏览器的后退按钮?或者“怎样才能防止用户点击后退按钮返回以前浏览过的页面?”1 ?. f3 ~% c: {& }% ` ! j. W% [, [* o' Y' g# a3 ~遗憾的是,我们无法禁用浏览器的后退按钮。 + v0 M/ R# u$ p6 L6 q# _. E; _5 I- @% g p( J1 o1 z' ^ 防止网页后退--新开窗口9 y) u z) z; X( O- J% x; I0 t# C) J - |7 O) A* b# Q: N 用window.open弹出表单页面,点提交后关闭该页;处理提交的ASP页也是用弹出,设定表单的target,点提交时window.open("XXX.asp","_blank"),然后用JS来提交表单,完成后window.close(); + \6 r: @+ _% Y/ f' c; v简单的说,就是提交表单的时候弹出新窗口,关闭本窗口。对于window.open()打开的窗口怎么后退?能后退到哪里去?* d2 R+ x5 q9 D/ c& k 1 P4 C; g* V2 g2 ~; Y) _* Q又一个新方法,放在ASP页面前面就可以了,其他如JSP也可以仿照一下~~/ b. u7 a$ U5 i3 r( L' `7 A% n / X# }* ]% z8 ~. s' {# u <%6 O$ V# ]" ~. k5 H5 V/ J dim RefreshIntervalTime 6 \. T2 _5 d5 ]RefreshIntervalTime = 3 '防止刷新的时间秒数,0表示不防止 1 Q3 X- v+ P& G/ }- A: @If Not IsEmpty(Session("visit")) and isnumeric(Session("visit")) and int(RefreshIntervalTime) > 0 Then 3 B. G" t5 Z# }1 \3 }0 ?if (timer()-int(Session("visit")))*1000 < RefreshIntervalTime * 1000 then 3 ?' R l! h1 ^0 v& P Response.write ("<meta http-equiv=""refresh"" c"& RefreshIntervalTime &""" />")+ P& v8 _8 k9 o$ |: r Response.write ("刷新过快,请稍候") ' p7 q. ]9 S" a Session("visit") = timer()* Y0 f, w5 H% B. {7 C Response.end! }/ W. @/ T D. b end if 0 v$ D; j6 y7 o5 X% oEnd If- _4 a: O5 k9 X Session("visit") = timer()3 L- U5 n/ |* g0 x" X! ~; [ %>
遨海湾-心灵的港湾 www.aosea.com
 楼主| 发表于 2008-1-9 10:11:00 | 显示全部楼层

5秒内不能刷新本页

<% , P6 }) R: @, a if DateDiff("s",session("time"),now())<5 then % B; {" ?+ L( S1 R. ?7 } response.write("<script>alert('不能在5秒内重新打开此页');</script") * [+ w8 h3 B+ u: \8 ]) j* V$ A else & ^* H7 w& { e6 |+ o session("time")=now(); - Z7 s& p: H) c& h: v end if " A( E e2 q0 E: l& A% y %>
遨海湾-心灵的港湾 www.aosea.com
回复

使用道具 举报

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

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

用ASP.NET开发的人对服务器端控件事件引起的页面刷新很头痛吧! * @- b$ ?" n+ G 2 a: Z; X4 l/ T, f! K 7 Y: X' p2 |% v1 I 3 r+ u. E: y2 O/ U# T2 J" G5 i 我把解决问题的方法拿出来与大家共享,思路是事件执行完后写段脚本,让页面自动滚动到刷新页面之前的控件处,减少页面刷新 2 k3 \ L3 C2 Q4 M 带来的不便。 $ G, B- n. D% K3 f& [ - X1 m8 ^: `1 e- i' R% ^. [" V4 j 比如按了一个按钮后,脚本会自动将页面自动滚动到这个按钮的位置。 \+ x1 [# B) T8 I- p & ?0 l; w8 j8 ^* A# E4 U' F ) i P; \0 b: V& q# R 1 n7 C( l1 q. \+ d6 H v) a8 T 写段脚本的事情,用了一个ScriptHelper的类来搞定,这个类有个GetViewControlScript(string controlName)的方法,它返回是 ) O, ?/ j* A" ~# C 一段客户端的脚本,传入的参数就是这个控件的ID。 5 W3 L2 @% i, e! }; o6 d' R$ R, X ScriptHelper类代码: 8 `+ B$ H. W0 ]3 Z' @! q | /// <summary> ; W* W3 g- o& G$ C' a ?. d /// 提供一些产生页面脚本的方法 3 i! {2 W% q+ C8 Q, j3 A /// </summary> " @5 A; X+ e- w# V& {* ~ public class ScriptHelper " K; I& y3 E" l4 x U4 i4 M5 E { 5 j( P3 O1 ?( W3 ?) ?8 r & \7 x$ q8 F" w, \2 M0 b  /// <summary> : ^+ @7 A. r/ M8 O7 `2 T; @/ `  /// 获取客户端查看控件的脚本 9 R1 p, H- m: P. F/ j& d  /// </summary> 9 H7 V- r3 H/ M' n0 Y& A# t0 x( f4 Z  /// <param name="controlName"></param> ! O% ^+ T% D; C& r M7 _+ N  /// <returns>脚本代码</returns> 5 z8 l- T2 ~! `2 d* @7 ]3 E9 `3 p* d  public static string GetViewControlScript(string controlName) 3 h2 G ?9 b. I( y$ E  { : Y4 x: E1 J& i4 @1 z , `5 v0 d- C( ~, \   //创建客户端函数ViewObj / l; N5 ]- I, ?   string script = "\n"; % c' ]: [; [* `, _( s   script += "<script language=\"javascript\">\n"; ) Y7 }0 m/ x4 q5 I) l   script += "function ViewObj(objName)\n"; # @: E! P# U3 A   script += "{\n"; $ L& e% n8 z! M/ ]& O4 _3 y   script += "var obj = document.all.item(objName);\n"; # s4 H) D. o& F9 R" ^$ U/ B   script += "if (obj != null)\n"; 1 Z1 X; t/ f6 ~( F   script += "{\n"; * i% G' G' R. j   script += "\tobj.scrollIntoView();\n"; $ l" t* W- ~: f3 K$ {   script += "\tobj.focus();\n"; ( g" F. Q0 g5 V; q) u$ o; R   script += "}\n"; , B! C+ P2 S% Y, E( S! ~   script += "}\n"; . r3 A% ?; q# d( @/ e 2 I2 I" B* i6 H# F* r4 ^! f //创建客户端函数ToDo . W. v/ r$ H [2 B& \( f# \   script += "function ToDo()"; ( z8 K2 `# ^$ ?/ T; g. ^5 f   script += "{\n"; : n. }5 b! Z: Y6 \   script += string.Format("setTimeout(\"ViewObj('{0}')\",1000);\n", controlName); + q- Q3 N, b- b5 C# U   script += "}\n"; $ P5 }& [% A! o. @( i# {+ ^" T" w5 F 2 [0 B8 ?, S. G/ ?* M* o; Q   script += "window.onload = ToDo;\n"; 3 V- {1 @1 J+ e& d   script += "</script>\n"; * d6 T$ ~5 |; |+ F ) V& q4 H; D4 q$ x   return script; # R( v& G2 K/ B: s% _/ |  } 3 E! B& w0 n* e1 a y % a* a1 h: w b! T G! ^ } s: v# m8 I' u2 g5 X; M& n + p8 a' u& ~4 Q& F. Q 使用示例: : v7 ?9 Q/ o0 j! S. u( | 0 a. f, ~8 f3 _% X 为了方便输入脚本,我在页面上放了个Label:lblScript,并把lblScript的EnableViewState属性和Visible属性设成False。 ; Q( o; X+ \6 [3 O ! H: b2 t7 t$ ~' O% [ p 然后在lblScrpt的Click事件的操作代码后添加输入脚本的代码,如下所示: ! v; t' s1 }6 ]5 Q/ _" W7 K& j private void btnSave_Click(object sender, System.EventArgs e) 9 V6 q1 O; W/ Z! w! D7 r( _' @ { + Z( t _3 j1 }0 N+ ` project.UpdateProjectInfo(ds); ( _1 e$ O, r$ W: v$ v" \' P0 r; \ lblScript.Text = ScriptHelper.GetViewControlScript("btnSave"); $ Z( F- }% u" w, g( g6 S+ {( {: V2 K } + t( Q; O F) ]1 C8 s# t * O& i0 {, c( |5 G- Z" o- [ 在点击btnSave按钮后,页面会自动滚动到btnSave的位置,减少了页面刷新带来的不便。 6 t) S2 \8 L1 X4 h:+ # D' E) P) t3 t$ O6 f, `9 ^8 R" O或者: 6 ~" u. m1 ]' C- s, M" ~ 6 k# c) [; c0 V在page_load()中增加判断 7 j; T7 Q! [' l% j/ s G if(!Page.IsPoastBack) . u6 J+ f W: F" @' }! c { . n* H# Q- r# @& T& T) a8 @( O //初始化页面内容; ' y5 C) V3 O1 w% m( M* n4 H }
遨海湾-心灵的港湾 www.aosea.com
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2025-4-4 22:52

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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