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

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

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

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

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

×
提交后禁用提交按钮(大部分人都是这样做的) ! j b) u6 ~! ^+ t; w4 g n% X* a3 a" l, c3 h* `. K如果客户提交后,按F5刷新怎么办?( @2 d; I. y, W g7 n' S/ [. L 7 c( D5 S" f/ h. K6 }6 C( j" b使用Session% S x& @1 h4 M5 s 3 Z4 _, N$ g/ b: d在提交的页面也就是数据库处理之前: & O" D1 {$ b; Q: I B5 Y/ v % { z6 l+ s% j# h3 F' C* Yif session("ok")=true then* C+ M7 _7 s% u response.write "错误,正在提交"3 X5 ]* l5 z! _! I7 F response.end$ | L5 J1 f% t- G3 {" R2 A# [ end if ) k! z" i6 u' b 0 H3 @" L5 z0 {9 J- e* Q0 a数据处理完后,修改session("ok")=false。 ' U, n! q! ]7 u+ _& X! S . _- N2 q" L( {/ W# I数据处理成功马上Redirect到另外一个页面 6 _ b. T7 O3 q0 T- j 9 }1 t* K- t) t( _6 I4 a; V操作后刷新的确是个问题,你可以使用跳转页面、关闭本页面,如果是有参数据条件来控制的,那就应该好做了,可以直接修改window.location的值,把参数全部改掉,这样就差不多了。 + H' o& Q9 d! d/ E- m 5 R. P/ V" Q3 o 缺点:简单地运用Response.Redirect将不再有效,因为用户从一个页面转到另一个页面,我们都必须用客户端代码清除location.history。注意,这种方法清除的是最后一个访问历史记录,而不是全部的访问记录。 点击后退按钮,再点击后退按钮,你可以看到这时打开的是本页面之前的页面!(当然,这是在你的客户端启用了JavaScript功能的条件下。) # t8 m3 z) L, m6 _; b3 v + _; x% p# P2 m# n Z 如果客户按后退,怎么办?* d& a2 y7 X* {7 M( b + J, d7 U3 l; x 防止网页后退--禁止缓存$ r+ S" Z6 P/ t, Y# c ( n, E; L4 r0 ]: `* ~0 w& k 我们在进行数据库添加操作的时候,如果允许后退,而正巧有刷新了页面,就会再次执行添加操作,无疑这不是我们需要的,像一般网上很多禁止缓存的代码,有时并不可靠,这时你只要在操作的页面加上就可以了,在网页的里指定要定向的新页,再点后退,看是不是不会再退到刚才的操作页面了,实际上已经把这个历史给删除了 0 W% a1 T& x) F8 q0 `( _* N3 M 4 l% c v8 M: `, F ASP:7 @: I$ {4 ]8 }: W Response.Buffer = True , M5 W# F. V9 Y: {6 T Response.ExpiresAbsolute = Now() - 1 ) g0 c9 U2 u+ u3 j: X0 }Response.Expires = 0 & ]; R' A* H! j4 P4 ]9 @0 hResponse.CacheC # ]7 C7 ~6 G! d/ t& c! X ' z( l0 F: E& _/ `$ N4 CASP.NET: 5 s$ e& z$ F( v, n2 `( k8 WResponse.Buffer=true;- L2 t$ C; d; j7 V5 n# a Response.ExpiresAbsolute=DateTime.Now.AddSeconds(-1); 8 g0 d. c0 k4 ?2 JResponse.Expires=0;( w7 t7 L4 v D+ r Response.CacheC; 1 G0 q- P) G( M! |$ N x' s) L$ F* p$ E& \3 u 究竟怎样才能"禁用"浏览器的后退按钮?或者“怎样才能防止用户点击后退按钮返回以前浏览过的页面?”2 `; |. E! K/ J/ s) c ; s! @: ~& D7 P 遗憾的是,我们无法禁用浏览器的后退按钮。 ( Y- N' V7 C* \ Q% i) P7 t# R( \: H$ J 防止网页后退--新开窗口 * C, ~: O$ \7 ~, G ( K: q- ^5 D. v8 a3 o: W& Z. L用window.open弹出表单页面,点提交后关闭该页;处理提交的ASP页也是用弹出,设定表单的target,点提交时window.open("XXX.asp","_blank"),然后用JS来提交表单,完成后window.close();- z! R/ A$ \$ ~& W, p x 简单的说,就是提交表单的时候弹出新窗口,关闭本窗口。对于window.open()打开的窗口怎么后退?能后退到哪里去?. }. g' j: E8 {* l; K4 k! J0 K2 s ) s: x; `; s5 C% b+ ?/ c又一个新方法,放在ASP页面前面就可以了,其他如JSP也可以仿照一下~~ 7 ~- K, \* @: Q$ h 8 |/ y ^. ?- o: _, [* I<% 7 f k2 g% B5 @; Tdim RefreshIntervalTime 7 p8 s. G% M5 N/ _8 s; yRefreshIntervalTime = 3 '防止刷新的时间秒数,0表示不防止 0 I, T1 t8 E- T3 gIf Not IsEmpty(Session("visit")) and isnumeric(Session("visit")) and int(RefreshIntervalTime) > 0 Then: w D. ]/ h' M) w/ \' M) O if (timer()-int(Session("visit")))*1000 < RefreshIntervalTime * 1000 then 9 k, `8 U" m" |0 l# h) J Response.write ("<meta http-equiv=""refresh"" c"& RefreshIntervalTime &""" />")5 x. u- b6 {1 X; i. B0 J, x Response.write ("刷新过快,请稍候") 1 J2 F- m# A( L Session("visit") = timer()+ o, S* P9 {' J# e Response.end 2 J! ^$ q( q! V! ^& q* D' k/ lend if 6 k9 y/ Y/ X+ g4 E3 {5 `8 y) IEnd If % d0 F2 k; d! |& c" B0 v5 xSession("visit") = timer() ( c8 ^* D Y, y%>
遨海湾-心灵的港湾 www.aosea.com
 楼主| 发表于 2008-1-9 10:11:00 | 显示全部楼层

5秒内不能刷新本页

<% # g: u2 V$ R; f if DateDiff("s",session("time"),now())<5 then * d+ E/ V: L# R response.write("<script>alert('不能在5秒内重新打开此页');</script") 8 p- l3 f9 W( k/ J6 C else . ?# `# Q) h" y: O z+ Y0 J session("time")=now(); + v" d5 G9 Q: w3 m% a9 s5 \3 i: i6 Y end if 0 D+ B1 n, ?& e+ W3 C4 ?) H %>
遨海湾-心灵的港湾 www.aosea.com
回复

使用道具 举报

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

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

用ASP.NET开发的人对服务器端控件事件引起的页面刷新很头痛吧! 4 t2 ?# [" ]) t- b+ T. y m& |9 B( t5 b " [% B; K: B# V 5 | ^, I( u* { ! v7 J! ?, I3 t9 ?' o 我把解决问题的方法拿出来与大家共享,思路是事件执行完后写段脚本,让页面自动滚动到刷新页面之前的控件处,减少页面刷新 3 C' D' N' Q' m& L; ~9 T 带来的不便。 ! v4 [! x& c+ |" U9 P . X( G5 q+ O" C$ U1 T' ] 比如按了一个按钮后,脚本会自动将页面自动滚动到这个按钮的位置。 4 w2 s+ P$ R$ x+ v5 o 9 {! c" i; R6 F1 n; q 8 i& H6 l. Q, N% ~9 W - y/ J. G' `; ?3 v9 e) T( Q; g 写段脚本的事情,用了一个ScriptHelper的类来搞定,这个类有个GetViewControlScript(string controlName)的方法,它返回是 . k% W3 `- x" j2 r( a$ W8 d 一段客户端的脚本,传入的参数就是这个控件的ID。 . L0 z/ s3 b+ H; P8 a ScriptHelper类代码: $ R: Q, t( v3 P7 y /// <summary> ! H! H$ c8 ^8 Q$ o' `" |( K5 T /// 提供一些产生页面脚本的方法 Z9 T+ V) m9 `& {6 T' V /// </summary> 8 {4 W, Z# f' O' y9 Y. i1 s public class ScriptHelper # s: i6 l& d. s( W( ^! v* Z2 `; H { 3 z6 t8 g7 M# \ t7 r7 G 8 e$ r& n } A" B- A' H, S  /// <summary> ) V7 B7 h: V6 \* E) U6 @  /// 获取客户端查看控件的脚本 - {5 `4 P) x3 w6 z7 w& X+ `7 t% G0 A  /// </summary> 1 R. c8 a( j$ u: [3 P4 ^  /// <param name="controlName"></param> : d1 z. @+ J9 U; @) g( A% r  /// <returns>脚本代码</returns> $ k3 y, d) ~. i/ R* k  public static string GetViewControlScript(string controlName) : Y- ~; }% l! {) k7 i+ ~& L5 P( Z  { 1 S. ?7 E6 |6 ^% y6 N8 P6 N + [2 N0 Q6 I+ _   //创建客户端函数ViewObj + M7 `% P- @3 Q/ v j6 q   string script = "\n"; , |, F- x7 T1 x2 {0 n   script += "<script language=\"javascript\">\n"; 9 ~" X) E- S- J# \& }   script += "function ViewObj(objName)\n"; - q K8 s r- K: n. |# i   script += "{\n"; 9 F5 [& \8 g9 O. t   script += "var obj = document.all.item(objName);\n"; 0 ?; N" I5 d! ?9 q' s* s6 |   script += "if (obj != null)\n"; ' ]0 T. O# q+ p* Z   script += "{\n"; ) m4 h* e _/ \   script += "\tobj.scrollIntoView();\n"; 1 z4 a# O& N, {) K" E2 k8 `8 l: ~6 E. a   script += "\tobj.focus();\n"; , h: P/ Z# Y+ e. a1 B, m   script += "}\n"; * l; `$ I. `/ g. Y) {1 ~   script += "}\n"; 1 D6 J5 w" o7 ^ ( Y1 e6 r9 I* m% ?# }& u //创建客户端函数ToDo : p' T9 _4 O5 v" a, v" d   script += "function ToDo()"; + M) K# R: E+ w& Q' ]9 i2 g% O   script += "{\n"; % K+ D* L4 O }' G   script += string.Format("setTimeout(\"ViewObj('{0}')\",1000);\n", controlName); # I8 d& |8 w; K4 Y6 t$ a   script += "}\n"; * K# f" L) K1 @* H& E% F: Y; W 7 r% ] x* Q# y' h& N& I0 X7 C   script += "window.onload = ToDo;\n"; # T0 C. n2 C4 A) \+ F: n+ o4 T   script += "</script>\n"; - [* Y2 v9 { u' {* C7 s. y1 m: J / ~- g% l6 m: U, B   return script; , }( f# G5 C4 O1 \' q  } 3 o3 ~6 E6 [ N, L% } % |/ H( F: b4 n7 @) k; | } . `0 g* C6 y4 `/ t' c5 } 2 |' F3 Q0 H$ F8 {" |: E 使用示例: 1 J* P6 ]$ P5 y0 `) Q7 R( d X 3 T' E% C; |7 w& P8 ?, q! M 为了方便输入脚本,我在页面上放了个Label:lblScript,并把lblScript的EnableViewState属性和Visible属性设成False。 ; m8 U, `- u! F! H, i, \" P / Y8 V2 S$ h( G$ B* q 然后在lblScrpt的Click事件的操作代码后添加输入脚本的代码,如下所示: ! o7 d; T% S; `& ~* h! Z; k7 J4 G3 b private void btnSave_Click(object sender, System.EventArgs e) " p8 \: o! j0 O# X, G { " I' ]" Y$ ?1 f project.UpdateProjectInfo(ds); & Z( v! ~# i. f+ @! G4 `# K lblScript.Text = ScriptHelper.GetViewControlScript("btnSave"); # t# n" h' _9 S1 m/ q7 I4 u3 U ]8 u5 s } " T( _. p) P" z G4 m+ j2 x 9 f7 y0 g( V5 c, |, [( ] 在点击btnSave按钮后,页面会自动滚动到btnSave的位置,减少了页面刷新带来的不便。 ; ]& p( E$ O2 j4 ]8 W! j/ c3 @ :+ ' w2 Z' M7 a6 Z. {) t5 Z$ H或者: 2 x8 B4 Q* D V4 w# T ' a! V/ A) G7 p" b4 I8 d; v在page_load()中增加判断 ]5 ]) Y$ S, T. v; |; B if(!Page.IsPoastBack) ; i( {1 m% p) S0 I# o6 k5 J" Y" \ { ; b1 @, _4 O- J: v+ Q //初始化页面内容; ( ^- r4 o' a# b( [9 q: V }
遨海湾-心灵的港湾 www.aosea.com
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2025-2-21 03:30

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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