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

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

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

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

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

×
提交后禁用提交按钮(大部分人都是这样做的) , V+ j9 |" s/ n1 x( ]8 u- {/ ^" a) r( B; \, A/ O, \ 如果客户提交后,按F5刷新怎么办?) ?1 c2 @# t8 c4 w . `0 \2 t# Z3 W/ x* v 使用Session5 \7 Z2 ~* I! H W$ B. v, e" D9 K在提交的页面也就是数据库处理之前:2 M6 K4 Y0 K1 q, `9 { 3 E3 r0 |. l' o) C& v& [' y2 Zif session("ok")=true then - T- b# b5 G- u9 e' C1 M- o response.write "错误,正在提交", e/ K2 c: N, l9 e response.end6 Q$ d0 |/ R9 ]1 S" R9 q end if0 W( h6 I- R2 }# x- L3 ]- h9 E1 W ' a4 d; i0 m( s' ?, Z 数据处理完后,修改session("ok")=false。 & ?* ~; u, K/ ^5 a ( _) L8 j% W3 A数据处理成功马上Redirect到另外一个页面 6 ~! l4 f |; [% w9 N8 V 2 L' r- Q7 d, D- k操作后刷新的确是个问题,你可以使用跳转页面、关闭本页面,如果是有参数据条件来控制的,那就应该好做了,可以直接修改window.location的值,把参数全部改掉,这样就差不多了。 9 `9 F4 E3 e( y& H. P1 X; ?3 g$ K+ ? / P/ Z) P! Z) I9 B8 B 缺点:简单地运用Response.Redirect将不再有效,因为用户从一个页面转到另一个页面,我们都必须用客户端代码清除location.history。注意,这种方法清除的是最后一个访问历史记录,而不是全部的访问记录。 点击后退按钮,再点击后退按钮,你可以看到这时打开的是本页面之前的页面!(当然,这是在你的客户端启用了JavaScript功能的条件下。) # G4 l4 D/ N8 V7 ^5 L9 n. x0 @5 t$ Q5 ~0 v2 `2 L 如果客户按后退,怎么办? ' [$ K% `5 X9 A/ a: w9 W ; m& s! Z: Y M/ N4 A5 B防止网页后退--禁止缓存- ~0 z. j I: n8 i " t' L; S/ g. L& `( x我们在进行数据库添加操作的时候,如果允许后退,而正巧有刷新了页面,就会再次执行添加操作,无疑这不是我们需要的,像一般网上很多禁止缓存的代码,有时并不可靠,这时你只要在操作的页面加上就可以了,在网页的里指定要定向的新页,再点后退,看是不是不会再退到刚才的操作页面了,实际上已经把这个历史给删除了 ) O, O% h/ ^% s # i( v. I+ r9 T- x% ~ B$ Q# | ASP: 9 i) x& k d% T' [$ F2 Z: `Response.Buffer = True 8 q# m8 ~7 [$ T9 \2 c2 C: E" GResponse.ExpiresAbsolute = Now() - 1 & ^. |3 V% l2 ~. r. m! N( x Response.Expires = 0 + C& h- Y) c# O* D4 R4 qResponse.CacheC 5 \, o& [1 z7 \0 z0 N6 j6 N7 j/ ^7 H& _ ASP.NET: 5 L& M% T4 b! L, _" E! B( l# hResponse.Buffer=true;% r/ \2 U& T- u. S( f7 r6 o Response.ExpiresAbsolute=DateTime.Now.AddSeconds(-1); 7 G- h$ o+ ?5 I; g ~* I$ K. aResponse.Expires=0; 2 y% r$ K( x! F8 U6 m" S# AResponse.CacheC; & r1 P/ X( N7 h8 X) M. N 2 t/ |9 x) o7 x s+ T" m# P, c究竟怎样才能"禁用"浏览器的后退按钮?或者“怎样才能防止用户点击后退按钮返回以前浏览过的页面?”, y* h" C' ]$ }7 ^* {- U , S1 T( q/ \1 k, G, p* p8 n 遗憾的是,我们无法禁用浏览器的后退按钮。 : x5 x1 H5 J" E( O+ D8 [' s) d9 t 防止网页后退--新开窗口 ' w8 t- W8 ?) r8 U! X$ d) X" b4 ?; a" l, i/ b8 c! R 用window.open弹出表单页面,点提交后关闭该页;处理提交的ASP页也是用弹出,设定表单的target,点提交时window.open("XXX.asp","_blank"),然后用JS来提交表单,完成后window.close(); - f* x' x: y6 }简单的说,就是提交表单的时候弹出新窗口,关闭本窗口。对于window.open()打开的窗口怎么后退?能后退到哪里去?: e% J$ R1 c4 |0 n1 o4 R+ x1 G! C) A7 P/ r : U' M" f) r2 R 又一个新方法,放在ASP页面前面就可以了,其他如JSP也可以仿照一下~~ 1 R3 j- \, X- {' L7 [5 X% o( {6 O" v3 v! S" _# \ <%+ o- o: h9 Q( _' ~- E0 M/ A7 _3 H dim RefreshIntervalTime % y. e/ j7 A& x" V+ {7 QRefreshIntervalTime = 3 '防止刷新的时间秒数,0表示不防止 ( I3 y, U' q( R' gIf Not IsEmpty(Session("visit")) and isnumeric(Session("visit")) and int(RefreshIntervalTime) > 0 Then7 p2 V) D3 w( Z; u# R- \ if (timer()-int(Session("visit")))*1000 < RefreshIntervalTime * 1000 then : G$ f+ p3 g, m7 Y; V& O( H/ R. p+ i Response.write ("<meta http-equiv=""refresh"" c"& RefreshIntervalTime &""" />") ; d, _/ [( E7 y/ u6 x Response.write ("刷新过快,请稍候")* t, H/ h9 Q C0 ?. m8 R1 N Session("visit") = timer()% l0 @" A1 E7 P Response.end 9 H v# L4 A5 ~: B; ~3 ]end if* F( @0 x- X5 b. o: P1 @: M( [# O End If ! k+ l( s! j0 C% d) rSession("visit") = timer() 6 O) i5 ]3 P$ D$ Z%>
遨海湾-心灵的港湾 www.aosea.com
 楼主| 发表于 2008-1-9 10:11:00 | 显示全部楼层

5秒内不能刷新本页

<% " r/ y4 L1 b. i* U* z# g if DateDiff("s",session("time"),now())<5 then / f1 [/ L) t$ I$ I response.write("<script>alert('不能在5秒内重新打开此页');</script") 3 j+ s, K) G2 r- a else * x/ q: g9 t/ u session("time")=now(); s8 S6 m8 l- Q end if 7 ~! j W, O% I3 | %>
遨海湾-心灵的港湾 www.aosea.com
回复

使用道具 举报

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

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

用ASP.NET开发的人对服务器端控件事件引起的页面刷新很头痛吧! / c6 o6 | c b4 [. q7 d" H% F& B & b9 _0 r j" W: D% _ 4 L( f5 C+ W7 ^ 5 O9 x) F' @; [7 ^" o 我把解决问题的方法拿出来与大家共享,思路是事件执行完后写段脚本,让页面自动滚动到刷新页面之前的控件处,减少页面刷新 $ l4 s6 C$ v" t! N 带来的不便。 ! R. U6 Z& g' [( X& E- h. O7 \ ! }# Y8 V) ]# a1 v% p 比如按了一个按钮后,脚本会自动将页面自动滚动到这个按钮的位置。 ! w" d. N8 [9 \( G2 t. R [" c ' l( ~. i8 @# U9 M; ?+ w" a 1 F% n4 F) o( _& ]4 V, [' U 7 L; ^, C9 g7 `: _4 f6 Y 写段脚本的事情,用了一个ScriptHelper的类来搞定,这个类有个GetViewControlScript(string controlName)的方法,它返回是 ( y1 O$ g) K' Q6 w# C% j9 R 一段客户端的脚本,传入的参数就是这个控件的ID。 3 y( N' u4 q* R5 F$ q ScriptHelper类代码: & B" N$ L0 N- Y/ z/ X /// <summary> 2 b9 B8 J4 @, g/ D2 a /// 提供一些产生页面脚本的方法 4 b3 H: r# i, I# @; F /// </summary> 3 K: m- A, v" s2 w5 F' a public class ScriptHelper # a0 Q' A5 n/ z. Y* Z { / I4 W6 R8 F' u* f1 L/ ^6 d . h4 ]% X4 h `! V. [/ Y( s+ m  /// <summary> 4 W- l3 E6 n, h$ g3 T4 [1 g& k  /// 获取客户端查看控件的脚本 7 b8 \( P( M0 |! k  /// </summary> . d! d: O; M! [  /// <param name="controlName"></param> $ \( J8 O% N% n$ k1 M x  /// <returns>脚本代码</returns> * s c+ Q3 M6 O+ n# y# e; L  public static string GetViewControlScript(string controlName) & Q3 O* Q( x) @* Z  { ( B' x3 y: b2 }$ E" H% V# L & k* ]9 L; o) M A   //创建客户端函数ViewObj - i+ S( O: k- w7 j9 t x   string script = "\n"; # g; H4 j0 r* c2 H6 q$ U   script += "<script language=\"javascript\">\n"; 6 J" ]& j8 b2 Y5 B   script += "function ViewObj(objName)\n"; ; @, l; n& i0 r3 d4 z/ Q" ]   script += "{\n"; 2 q1 y* B7 i6 e. ~( q   script += "var obj = document.all.item(objName);\n"; ( w, ^2 u' o- L4 M$ `+ l0 I, y   script += "if (obj != null)\n"; # Q3 N9 R# B. N/ j) f7 R) x   script += "{\n"; * O& ^. _: L0 l t: K6 t   script += "\tobj.scrollIntoView();\n"; ! M- C8 N( {' S) X! I   script += "\tobj.focus();\n"; 2 [" v, j; G& ~# t% l   script += "}\n"; : W- `, j! `! G) |2 K9 o; _   script += "}\n"; Y7 _3 Z7 U) v+ k7 ~6 i & }- ~3 |, k- ? k' d; W8 c* } //创建客户端函数ToDo / H8 C/ p, h# {; {: `5 W   script += "function ToDo()"; 4 b8 A' u5 {3 `6 Y( r4 f   script += "{\n"; 2 [3 n6 p! K `8 }   script += string.Format("setTimeout(\"ViewObj('{0}')\",1000);\n", controlName); / B. L2 J, L6 ?- ~ O) U   script += "}\n"; ( k9 R* A& r- a+ O- U1 V6 Z 3 [2 t3 Z) @ g! i a   script += "window.onload = ToDo;\n"; / u( E% p6 E* l2 w" U+ @   script += "</script>\n"; 4 y/ i( c1 z- @ - ?* F* X4 E9 A9 H+ R! |3 K0 |) s   return script; # J3 ~9 G) ~( Q  } i3 E0 Z+ _: {1 w; K - @) K1 P0 f9 ]9 D6 S# l } - T4 z0 `% @. U: a8 ~! Q' Y Z / t% n4 F6 v9 Q& e. ?# ^' ? 使用示例: 5 Y8 Y% V) @" {2 n - n1 y: C+ U! v& B7 b( D4 u 为了方便输入脚本,我在页面上放了个Label:lblScript,并把lblScript的EnableViewState属性和Visible属性设成False。 6 y+ ^9 ^5 |6 y+ S" \6 T( T9 i" ] % }+ i: L i2 |% [( f& f# d 然后在lblScrpt的Click事件的操作代码后添加输入脚本的代码,如下所示: k- z( g! @% Q: [/ G$ y private void btnSave_Click(object sender, System.EventArgs e) : w: u- R( M; |+ m4 W( u$ p2 z3 u { 0 z# `. `5 `/ t# l$ o project.UpdateProjectInfo(ds); 6 a8 u5 _ K1 l5 `& O lblScript.Text = ScriptHelper.GetViewControlScript("btnSave"); & O4 ]1 Y/ I! V7 v, U% s8 E3 { } 3 L6 E0 ?, [+ g3 y $ {: f" v- F6 H C 在点击btnSave按钮后,页面会自动滚动到btnSave的位置,减少了页面刷新带来的不便。 ) N, f* @" Z9 q' [: Z+ f:+ ' p* ~7 t: Y) N) z2 R 或者:! ]# @# i( |( O/ Y7 O& R( ~9 S & w% O" a A( e [在page_load()中增加判断 " ^! S7 o- R3 u; \5 M- j( F if(!Page.IsPoastBack) 3 S/ K0 c: {5 U# r b5 M1 F { . F) f" n& J! A- D' T) ? //初始化页面内容; 0 h" N: G0 O' R, O/ |& \- e$ M' T }
遨海湾-心灵的港湾 www.aosea.com
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-7-8 08:41

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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