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

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

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

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

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

×
提交后禁用提交按钮(大部分人都是这样做的)5 b* m$ {9 |5 q- a# ` 7 b) p7 s7 T! P1 q如果客户提交后,按F5刷新怎么办?9 m; o: y6 `: `3 E, l* R- |1 ^ * ]: w+ \7 x0 w使用Session 0 L& }" e6 N. H9 g( ]& g* b! l: H% k( {$ H1 h* _5 V" d$ v 在提交的页面也就是数据库处理之前:! e0 n0 x6 z2 O ( H1 u; b9 u: F4 g4 |% yif session("ok")=true then 4 T1 H T7 w$ s% d' R" E+ }4 b response.write "错误,正在提交" 8 p: ?9 }& ]" m$ y* j" A. M response.end; ]2 b- Q& R, D end if 9 z1 X% p1 a) f8 S5 `* m7 K* r. C # l0 u9 G1 k. E. Q$ x+ V* P数据处理完后,修改session("ok")=false。 ) F4 f4 {- ?) e) u/ j9 z) S ) S9 G) k5 t! t X数据处理成功马上Redirect到另外一个页面2 Z! h" y$ |, t3 r/ x7 @% v$ D ' r6 O) J0 U, i4 C 操作后刷新的确是个问题,你可以使用跳转页面、关闭本页面,如果是有参数据条件来控制的,那就应该好做了,可以直接修改window.location的值,把参数全部改掉,这样就差不多了。 ! x% s3 A4 s: S) L0 q5 |% [" {: G$ O8 ?6 A4 l4 D$ r8 k' X7 P 缺点:简单地运用Response.Redirect将不再有效,因为用户从一个页面转到另一个页面,我们都必须用客户端代码清除location.history。注意,这种方法清除的是最后一个访问历史记录,而不是全部的访问记录。 点击后退按钮,再点击后退按钮,你可以看到这时打开的是本页面之前的页面!(当然,这是在你的客户端启用了JavaScript功能的条件下。) & Z$ m/ r# t, B7 {, s/ c( i# w / A5 N' a: |" ?" Y- f, i1 {$ j+ R如果客户按后退,怎么办?0 ~! _) q0 F& O1 @+ D ~9 x " B7 F& [' }% ~ 防止网页后退--禁止缓存 - i4 J6 E# W1 t7 _( k2 g- B6 [! I" s. K# O 我们在进行数据库添加操作的时候,如果允许后退,而正巧有刷新了页面,就会再次执行添加操作,无疑这不是我们需要的,像一般网上很多禁止缓存的代码,有时并不可靠,这时你只要在操作的页面加上就可以了,在网页的里指定要定向的新页,再点后退,看是不是不会再退到刚才的操作页面了,实际上已经把这个历史给删除了 1 G* S9 x) o0 a: I9 `% W/ y( r d- I$ i+ ?* z3 y) N6 j" m! u ASP: * e; T" R- e8 [2 }- kResponse.Buffer = True z" L7 ]( Z+ x1 N8 K R/ E. S Response.ExpiresAbsolute = Now() - 1 4 x+ W/ ?. [' G0 d# X7 L7 W( x0 `Response.Expires = 0 0 ~0 H \) O4 T. u/ L, P Response.CacheC , S4 v$ W7 ]! C , L8 E8 Z4 m4 gASP.NET:& Y" D' S, p2 |. w% e9 x- b Response.Buffer=true; 0 c0 Q$ w3 i a# n1 W3 s- ^( J+ Z! VResponse.ExpiresAbsolute=DateTime.Now.AddSeconds(-1); 5 J- w- F4 t3 N* h; S# ?Response.Expires=0;3 \0 y. \6 @" L% k7 P1 { Response.CacheC; ~8 g# I0 Y1 C* Q* X ( ~! B& x" }- L- _$ j3 l究竟怎样才能"禁用"浏览器的后退按钮?或者“怎样才能防止用户点击后退按钮返回以前浏览过的页面?”, G1 m& y% i& u# R. J0 | 6 i( ^( S! `1 G" N% t3 N遗憾的是,我们无法禁用浏览器的后退按钮。0 M0 C7 O" C/ |1 G+ E4 d 1 v3 A: B8 b! \& u0 t2 f9 o j防止网页后退--新开窗口 ! z; H1 S( S% Y 1 {/ Q$ O o$ i0 ]# X3 j用window.open弹出表单页面,点提交后关闭该页;处理提交的ASP页也是用弹出,设定表单的target,点提交时window.open("XXX.asp","_blank"),然后用JS来提交表单,完成后window.close(); ; z& ]9 `& `+ m9 Q( ?简单的说,就是提交表单的时候弹出新窗口,关闭本窗口。对于window.open()打开的窗口怎么后退?能后退到哪里去?/ E9 c9 k; H/ L6 d + A$ z8 _- R& R l: H6 D: ]2 @又一个新方法,放在ASP页面前面就可以了,其他如JSP也可以仿照一下~~ 9 R G; r" r. [; p4 v, B; a: t4 l9 Y2 `% i9 x! D" S$ V+ f1 g <%( n" R* Z7 Q9 \2 R4 y/ Q dim RefreshIntervalTime E7 G Q* e5 `9 iRefreshIntervalTime = 3 '防止刷新的时间秒数,0表示不防止 ( n# n) r9 G3 `) o/ q! r* jIf Not IsEmpty(Session("visit")) and isnumeric(Session("visit")) and int(RefreshIntervalTime) > 0 Then1 a5 k# h# O( ?' [! W if (timer()-int(Session("visit")))*1000 < RefreshIntervalTime * 1000 then0 ?$ ~( M9 T% N7 I0 o Response.write ("<meta http-equiv=""refresh"" c"& RefreshIntervalTime &""" />") # i" e8 X0 \3 }5 \: ?+ a; V Response.write ("刷新过快,请稍候")( ~$ s& g2 S3 ~# M8 h, S2 J# V @ Session("visit") = timer() # S( k6 t) v! b. [ Response.end1 {8 A$ o1 ~. Y8 d3 H end if- I1 F! T0 } C/ @8 x/ { End If ( l( }! z( I* g. cSession("visit") = timer() 0 T2 ~& f- r- B% \%>
遨海湾-心灵的港湾 www.aosea.com
 楼主| 发表于 2008-1-9 10:11:00 | 显示全部楼层

5秒内不能刷新本页

<% & V. C+ j% J d. O/ g4 a# X if DateDiff("s",session("time"),now())<5 then : ~$ M: b; D6 u response.write("<script>alert('不能在5秒内重新打开此页');</script") 2 _* l4 k/ X9 I% D: F) g* H; Z else * S- ]2 S6 t# b# \3 |1 G# e& ` session("time")=now(); ; D# j% H4 g% r! e- j% R! |. R end if 3 W1 j5 B# N9 _0 ~7 @5 p9 T3 {8 O %>
遨海湾-心灵的港湾 www.aosea.com
回复

使用道具 举报

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

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

用ASP.NET开发的人对服务器端控件事件引起的页面刷新很头痛吧! " X7 R. @) l0 k0 p # g. \5 O8 s, b 4 ^1 g, p h; r. [ ( H2 D, C% e4 ?) S 我把解决问题的方法拿出来与大家共享,思路是事件执行完后写段脚本,让页面自动滚动到刷新页面之前的控件处,减少页面刷新 / t1 z2 x+ G) D3 J7 G: H 带来的不便。 6 }: w# d j$ T: v- ?; R , O3 F* I; H S& }. p 比如按了一个按钮后,脚本会自动将页面自动滚动到这个按钮的位置。 # s% o4 g3 l: Q8 y* ^: o; k! Z4 h , R1 j: G( y6 g; S3 H2 u% g 4 w' C9 y( ^5 F ( |3 T! c7 M" U, t$ }* c 写段脚本的事情,用了一个ScriptHelper的类来搞定,这个类有个GetViewControlScript(string controlName)的方法,它返回是 8 `! l! f$ z, } 一段客户端的脚本,传入的参数就是这个控件的ID。 7 u8 ^3 x- l7 Q$ c ScriptHelper类代码: * R' Q4 z0 G+ Z! I /// <summary> " n% q. s& |6 m5 Z1 N" e' N /// 提供一些产生页面脚本的方法 % c6 C, u$ n6 y4 u8 Y /// </summary> 4 L2 F* [- X/ }- F public class ScriptHelper 3 c9 w9 J) `; q1 m# g F { 6 S$ W0 m- C1 @' C. H2 g6 t8 N 8 M7 @5 o: Q4 K7 I9 `% \* C  /// <summary> 6 S8 a( d' N7 _8 I  /// 获取客户端查看控件的脚本 - u8 j* w# t: d" V h  /// </summary> ' n: L; F3 b* k9 K" G( }8 P4 @  /// <param name="controlName"></param> . t! |* h7 l" u) N) C+ z5 {  /// <returns>脚本代码</returns> + @' z) B. \$ w  public static string GetViewControlScript(string controlName) 1 K+ Q7 e; a% y9 q6 b/ G  { 1 t# H9 f! j; _8 d# L3 q' l7 S8 Y 3 W, K( {/ w6 k& y/ r. x/ D4 ^   //创建客户端函数ViewObj ( I: Z+ i$ `5 K   string script = "\n"; % ?* H4 e# K" T4 X5 c5 @   script += "<script language=\"javascript\">\n"; ( L! t! t" m# J% H/ p4 j9 I3 l. g   script += "function ViewObj(objName)\n"; 6 O/ p3 ~7 Y0 k u+ O5 w   script += "{\n"; , p6 v k! B2 B0 d. C   script += "var obj = document.all.item(objName);\n"; * F9 u7 f; v% k- L/ H5 T1 t   script += "if (obj != null)\n"; * t: Z- u0 z9 h* s   script += "{\n"; : e7 y+ @1 U1 b3 @   script += "\tobj.scrollIntoView();\n"; 4 g# i$ H& ?) F5 b% k N   script += "\tobj.focus();\n"; ' \5 T/ F. u. ?" @6 |' e1 ^& s   script += "}\n"; + I; Q0 W% W% W% l& S) k   script += "}\n"; ; P6 J4 O* Z. g& P- x* p$ v 7 t( _/ a3 J0 }" V& Q //创建客户端函数ToDo & b0 Q2 \0 @; R' B   script += "function ToDo()"; + l2 j$ C* \1 H6 ^ J0 G   script += "{\n"; . O& y8 [5 i2 z5 U7 M   script += string.Format("setTimeout(\"ViewObj('{0}')\",1000);\n", controlName); 1 h( V* b1 ]- I   script += "}\n"; . k" q5 \( V/ W8 ]0 d ; ^7 I' l1 e9 L% l& G   script += "window.onload = ToDo;\n"; $ ?) V; x% @& T" {4 C4 i0 i   script += "</script>\n"; 7 j5 P3 y" V, `, I2 A 0 ~7 _" n* B- C" P   return script; : l- {4 V; s- _- o9 Z  } ) f& z0 u$ }$ l. r : c0 y; [ F/ {) U/ b2 i: w) _ } . t+ ?" C6 c/ r% [ d+ ? . j1 l: n7 Y: z* f5 b$ ` E 使用示例: & q) A- w" n8 A V) Z/ Z( U& N 8 D) F* S; G1 b6 n; h! y' q: M 为了方便输入脚本,我在页面上放了个Label:lblScript,并把lblScript的EnableViewState属性和Visible属性设成False。 ) |1 O5 {9 w5 s2 ^$ U- {7 T ' Q/ N+ X8 n M; U 然后在lblScrpt的Click事件的操作代码后添加输入脚本的代码,如下所示: ' {9 Q% g. l! ]3 _6 L private void btnSave_Click(object sender, System.EventArgs e) / l* D, I* u' _0 Q7 s+ ?( } { , \! j. o$ ~5 m& P project.UpdateProjectInfo(ds); + _4 G' C/ `, q lblScript.Text = ScriptHelper.GetViewControlScript("btnSave"); 4 o* {( U3 ]. W3 W! D1 N! V, r0 ~ } * r3 p4 @% X* A0 K8 g, ? ' h$ n) Z% Z: r4 J/ l+ d& T 在点击btnSave按钮后,页面会自动滚动到btnSave的位置,减少了页面刷新带来的不便。 % {& J ~: t* x6 z) U :+ . i" W- J9 w+ x8 G 或者: , f1 D8 w3 Y! G/ A/ v: A) T% j' Z" |2 D! o( h; s 在page_load()中增加判断 l1 X( h5 Z+ C6 Z C7 J) ^& w3 f/ Q if(!Page.IsPoastBack) / j% b: j& S0 |4 _( P% q { * J6 @' K5 p! I/ P1 U //初始化页面内容; $ [: K" t- T7 t7 y* P( U' ` }
遨海湾-心灵的港湾 www.aosea.com
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2025-1-18 17:11

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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