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

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

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

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

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

×
提交后禁用提交按钮(大部分人都是这样做的) 1 c' A. `0 S8 n 4 s0 T7 t* o. y1 E2 c' R, I如果客户提交后,按F5刷新怎么办? # H9 G9 r' ]8 b4 a& \' S3 ? . e( H$ q( x7 a$ e0 G使用Session# D# \8 ~+ K! G" [* `3 M( S ! ] t; _' G `" }7 e 在提交的页面也就是数据库处理之前: , ~) K0 ~* Z$ ~$ X / }7 F2 v; E' Z0 I( hif session("ok")=true then + I. e) j; M6 T8 D response.write "错误,正在提交"( f( \( [$ w ^0 y! q% K: k$ R response.end, |: x% y& o5 V9 a8 [) m end if/ J2 E& h, e/ s9 k8 G/ C , i' ~! O0 H( I; {1 C数据处理完后,修改session("ok")=false。 5 y/ r" Q5 ]' B6 {% A7 N3 \) g5 I [6 A 数据处理成功马上Redirect到另外一个页面 8 H j7 ?1 O9 i+ i; |6 v! Y) u! U& Z0 `+ N `* Q0 a) Y2 K1 m' _; t 操作后刷新的确是个问题,你可以使用跳转页面、关闭本页面,如果是有参数据条件来控制的,那就应该好做了,可以直接修改window.location的值,把参数全部改掉,这样就差不多了。 m% E5 u/ T* J- N$ f9 {' M / x1 }3 l8 T( l k* W0 ]缺点:简单地运用Response.Redirect将不再有效,因为用户从一个页面转到另一个页面,我们都必须用客户端代码清除location.history。注意,这种方法清除的是最后一个访问历史记录,而不是全部的访问记录。 点击后退按钮,再点击后退按钮,你可以看到这时打开的是本页面之前的页面!(当然,这是在你的客户端启用了JavaScript功能的条件下。) ; k( ?" P' F; K$ M" K 9 c$ v3 i2 [% l6 B如果客户按后退,怎么办? 0 J5 _" F5 ]8 b 3 a$ c; ~+ y% D; x% S& p/ Z Y/ ^防止网页后退--禁止缓存 * r( \3 ~3 K( B% ` * W# ~2 p2 H& J) ^5 m u& ^; B我们在进行数据库添加操作的时候,如果允许后退,而正巧有刷新了页面,就会再次执行添加操作,无疑这不是我们需要的,像一般网上很多禁止缓存的代码,有时并不可靠,这时你只要在操作的页面加上就可以了,在网页的里指定要定向的新页,再点后退,看是不是不会再退到刚才的操作页面了,实际上已经把这个历史给删除了 - v/ G7 f" j. ~7 O$ d, _7 d& U5 j9 v) ~1 F; D* ^5 C) t ASP: % j( K/ n- o: i+ mResponse.Buffer = True + V! Q6 f7 [7 c |Response.ExpiresAbsolute = Now() - 1 3 I- e* ^0 z; vResponse.Expires = 0 # d7 f1 v+ N6 J6 m Response.CacheC ! B% }0 l, f, [! K9 d6 y- u V0 U* `9 P" N% L5 p5 s6 XASP.NET: , a4 E3 R" d6 u* i7 u& X" _7 QResponse.Buffer=true; : f% y c: i4 q5 u# v# r% `; h$ q- wResponse.ExpiresAbsolute=DateTime.Now.AddSeconds(-1); 5 Q0 T+ f" A- Q- z4 I6 o3 SResponse.Expires=0;2 w7 L) T! f7 b7 G$ a Response.CacheC; 9 |* @ \! |6 k 0 R- j4 w" c5 l6 P究竟怎样才能"禁用"浏览器的后退按钮?或者“怎样才能防止用户点击后退按钮返回以前浏览过的页面?”4 m$ o" u- U0 |5 P: \# V. N _1 G7 j : r2 } b9 T6 o* q' \遗憾的是,我们无法禁用浏览器的后退按钮。 % Z- D; |4 d) W: J ; w4 R j2 R: f, H7 w防止网页后退--新开窗口3 n x( A4 @, p) @3 s) s, j4 v# H ; r9 k! c: i2 E4 I+ j% x 用window.open弹出表单页面,点提交后关闭该页;处理提交的ASP页也是用弹出,设定表单的target,点提交时window.open("XXX.asp","_blank"),然后用JS来提交表单,完成后window.close();0 \3 B0 c p" G0 w: ~, v# Q 简单的说,就是提交表单的时候弹出新窗口,关闭本窗口。对于window.open()打开的窗口怎么后退?能后退到哪里去? ' x8 X4 Q9 T2 |# D3 U0 m ; G9 t& W$ z8 ]% U: a0 b又一个新方法,放在ASP页面前面就可以了,其他如JSP也可以仿照一下~~ ! t X2 x5 I( z) k5 s) K) X & W9 \2 ~9 g7 n V( |# d( t; z, q: R<%0 L. h. B& R0 {+ p. B) [ dim RefreshIntervalTime* m' d% }- t5 l7 y% k) z RefreshIntervalTime = 3 '防止刷新的时间秒数,0表示不防止$ H' A: Q( R- `, g. ~ If Not IsEmpty(Session("visit")) and isnumeric(Session("visit")) and int(RefreshIntervalTime) > 0 Then \4 c: V- h6 a: m2 s if (timer()-int(Session("visit")))*1000 < RefreshIntervalTime * 1000 then, ?' o0 X, \3 [. T' z% ~ Response.write ("<meta http-equiv=""refresh"" c"& RefreshIntervalTime &""" />")7 o" `3 |5 \! M1 N Response.write ("刷新过快,请稍候") ' b6 Q9 V: W% f4 m' @) z$ E Session("visit") = timer() - |+ S ~" Q, f9 ^ I0 y3 D8 f! m6 i& ] Response.end" B, ]# J+ G1 O' o end if* n! K+ U1 B5 c9 h5 N End If0 S! E7 O: W! U* ~4 ] Session("visit") = timer() K q. k2 l7 P+ v3 i1 f%>
遨海湾-心灵的港湾 www.aosea.com
 楼主| 发表于 2008-1-9 10:11:00 | 显示全部楼层

5秒内不能刷新本页

<% + G1 l+ F; X% T* r& V9 ]! B if DateDiff("s",session("time"),now())<5 then ' Z4 B+ s) T+ A3 s response.write("<script>alert('不能在5秒内重新打开此页');</script") ) J4 m7 ]" @) U" Z else 1 q6 R4 L2 |; G2 M session("time")=now(); 9 q* t( b" w) K7 I8 L0 E end if # N; p1 l2 L% c6 @$ | %>
遨海湾-心灵的港湾 www.aosea.com
回复

使用道具 举报

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

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

用ASP.NET开发的人对服务器端控件事件引起的页面刷新很头痛吧! 6 ]8 f2 q5 d) F( F* e0 \ 9 U0 m( m# V1 ?3 L4 X5 f/ m2 K 3 k/ U4 u k9 f+ Q# M+ O6 Q 5 ^! g" T1 V; |* e0 o 我把解决问题的方法拿出来与大家共享,思路是事件执行完后写段脚本,让页面自动滚动到刷新页面之前的控件处,减少页面刷新 7 E) a7 i0 a8 h 带来的不便。 / f& P/ T# g( R/ K+ \ , x% S- W6 n) n+ x8 K 比如按了一个按钮后,脚本会自动将页面自动滚动到这个按钮的位置。 9 {: C& j4 t; z, K L , ?* `/ ^8 z/ ? . i* [' s- x- { t1 { g4 i+ ^* Z4 t/ U' r 写段脚本的事情,用了一个ScriptHelper的类来搞定,这个类有个GetViewControlScript(string controlName)的方法,它返回是 # }9 o/ Y/ h' \" \+ U 一段客户端的脚本,传入的参数就是这个控件的ID。 % U* M0 y- c% w. n- F ScriptHelper类代码: + I: x5 t1 K# @ /// <summary> + w9 m9 f9 }( [/ ? /// 提供一些产生页面脚本的方法 # C5 F1 f6 I6 V7 r1 J' R2 |& ] /// </summary> 3 n0 I6 V3 n/ A2 \4 l, c6 w1 O public class ScriptHelper - s8 D% T5 q8 t8 t2 y* K0 z { 6 `: @& i7 |$ n9 f0 I 3 T9 d4 B. d' M  /// <summary> % ]% ^; y+ u- U' @: n& z# J- b) T  /// 获取客户端查看控件的脚本 4 J! }: Z# d7 d: q8 p+ P  /// </summary> % }0 B, j' V- I+ D. Y( T* L; {  /// <param name="controlName"></param> 3 i6 e' l+ o3 z  /// <returns>脚本代码</returns> ; [ e" r D1 S9 g  public static string GetViewControlScript(string controlName) 1 [& R' A h! z  { * ~' d" Y0 x7 y9 U6 S% N 8 d- _, W; i6 L6 z# {   //创建客户端函数ViewObj 9 C$ y6 ^3 S; h- G0 Z9 q& D6 O   string script = "\n"; ( g5 ~' D+ n3 j$ y/ B' r   script += "<script language=\"javascript\">\n"; ' B" f$ q& W* Y a/ W2 ]% i3 C+ h& C   script += "function ViewObj(objName)\n"; / C' b: q7 \- ?4 q. o. s% U9 z   script += "{\n"; ' t2 f+ h( U: X P* p   script += "var obj = document.all.item(objName);\n"; 0 l* j3 I# w# l: B   script += "if (obj != null)\n"; ; ^5 H8 ]' [' q. S# W   script += "{\n"; : `( Q; H3 ~" s# l q   script += "\tobj.scrollIntoView();\n"; 0 T9 j" F4 p1 N9 F2 V1 P   script += "\tobj.focus();\n"; 9 u0 z" v7 Y3 K4 B( j& h5 K   script += "}\n"; 4 u% D+ \0 B# d, U5 b$ c1 }" Y4 [   script += "}\n"; * s$ `6 f. T1 g) X9 g+ c! Z ) R- s9 I, L4 d2 I, {4 Z* s //创建客户端函数ToDo , m2 [& v( C& ]   script += "function ToDo()"; - Q9 e7 A5 l( m" y% `5 @- ~0 G   script += "{\n"; 1 p7 z! b2 s$ u8 }8 I4 } k) P   script += string.Format("setTimeout(\"ViewObj('{0}')\",1000);\n", controlName); ; A O5 x0 A U, r5 W, ~9 y: t   script += "}\n"; ; P# W* V" O! {' b. B; f0 Z# g 5 R! w% G$ W9 U5 B+ i: J- Z   script += "window.onload = ToDo;\n"; 9 O2 }* ?: v \   script += "</script>\n"; / u8 b5 f( ?6 l$ H, j8 v # h. _' V! n( Z% b" ^1 a   return script; 5 Y2 \# R& w7 T$ Z3 C  } & v4 g* F' O* \# F ) l! s O0 D7 q& b" X( ~. p6 ] } * O4 h# E9 C* G2 \7 v9 r4 v : V0 l" |# g: X \# H0 c) j 使用示例: % x& i: f8 r1 E* U8 F; [ # `9 M- _4 C( m; l6 c1 i 为了方便输入脚本,我在页面上放了个Label:lblScript,并把lblScript的EnableViewState属性和Visible属性设成False。 8 l5 a) h# p' W/ ~$ K+ g4 v3 h: ~ 2 U' I: @6 D$ Z8 } 然后在lblScrpt的Click事件的操作代码后添加输入脚本的代码,如下所示: 8 q( c8 ]/ I) W& U8 L private void btnSave_Click(object sender, System.EventArgs e) 9 @+ D: U( F3 w5 e& P { ' e% A4 D. z. T/ M2 s# L project.UpdateProjectInfo(ds); 3 f' L+ n3 V6 a* o; z lblScript.Text = ScriptHelper.GetViewControlScript("btnSave"); , \2 t$ X- ]$ P) e i } , z0 W; q& N8 [, Q) l # u5 e3 ~* E; |, b7 I5 r 在点击btnSave按钮后,页面会自动滚动到btnSave的位置,减少了页面刷新带来的不便。 4 `5 e/ O: R! U: m:+ : ?- n; k7 f3 E' S3 d( l或者: 2 M' ^) K9 @1 f, Z/ ? r ?& m1 n- B在page_load()中增加判断 / g4 ?5 c: N7 K- o4 E/ A if(!Page.IsPoastBack) 1 g- J2 n# z( R& c& T$ X& l: { { 5 U7 j% G+ ?$ ^1 C/ V //初始化页面内容; . \! @- u6 ^& B* j }
遨海湾-心灵的港湾 www.aosea.com
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-22 07:28

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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