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

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

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

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

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

×
提交后禁用提交按钮(大部分人都是这样做的): m6 u9 S& u. A+ }8 v% l/ V, `6 L - }2 n1 x/ J* ]# W如果客户提交后,按F5刷新怎么办? & d- U1 J9 `7 f+ I2 C$ M( n6 O0 d' i7 [4 F3 W& R/ S 使用Session8 d. a0 B0 k1 G* ~9 M- V 5 k' H" b, k- R$ N 在提交的页面也就是数据库处理之前:1 i* f6 P+ s6 x# a: R& B - N1 U% f$ ~- m9 Q. Q# f! h! Iif session("ok")=true then 9 @. k6 O2 e+ Z3 p9 | response.write "错误,正在提交" , ]5 B0 ]& `/ u( d1 D response.end2 z w7 t7 ~9 q- i5 U. B* t end if , R) r9 e) X9 J- D ~$ Q0 j* P2 F3 ^! C; v数据处理完后,修改session("ok")=false。 ! K. F k; C, y& f, s. ?4 p. i) e5 A2 g: W2 s8 o0 c 数据处理成功马上Redirect到另外一个页面( R# w0 w9 u4 Z . X3 G! u; E' e; w9 [; y) p 操作后刷新的确是个问题,你可以使用跳转页面、关闭本页面,如果是有参数据条件来控制的,那就应该好做了,可以直接修改window.location的值,把参数全部改掉,这样就差不多了。 * R5 m: O# z5 g+ l) K+ [/ j8 q9 o/ X( i; u0 A6 b 缺点:简单地运用Response.Redirect将不再有效,因为用户从一个页面转到另一个页面,我们都必须用客户端代码清除location.history。注意,这种方法清除的是最后一个访问历史记录,而不是全部的访问记录。 点击后退按钮,再点击后退按钮,你可以看到这时打开的是本页面之前的页面!(当然,这是在你的客户端启用了JavaScript功能的条件下。) # w) @6 P9 C1 s' {3 r$ @ ) Q/ K+ ]* q5 m) x7 H4 n如果客户按后退,怎么办?% c( B) ~3 l' n3 D( t ' h- X: S8 C6 ^8 t 防止网页后退--禁止缓存 9 u, k6 A$ ~ U5 Y% E3 c/ |( q6 [7 P1 I- J" I) d$ R 我们在进行数据库添加操作的时候,如果允许后退,而正巧有刷新了页面,就会再次执行添加操作,无疑这不是我们需要的,像一般网上很多禁止缓存的代码,有时并不可靠,这时你只要在操作的页面加上就可以了,在网页的里指定要定向的新页,再点后退,看是不是不会再退到刚才的操作页面了,实际上已经把这个历史给删除了 / s! X8 K5 ?/ O. {9 Q9 Y + Q0 M+ `3 U9 L \9 ~ASP:: F( G4 d' w& Q! H, d6 s Response.Buffer = True 4 W- z5 _7 r/ x Response.ExpiresAbsolute = Now() - 1 : Q1 U5 M4 l& q: N. Q3 M! W) @" V* ~Response.Expires = 0 / Z8 v. L" Y5 s. } Response.CacheC* u+ I! w- ^; t" n, b5 @7 y3 j , z. O6 K; h* E0 H8 l! j) b8 b; l ASP.NET:3 k* E5 J/ n. b% N+ R2 @/ Z Response.Buffer=true;" [3 u( ] d8 P3 } Response.ExpiresAbsolute=DateTime.Now.AddSeconds(-1); 0 ]& B8 ~6 w% W& |* D' zResponse.Expires=0; . f0 w* e1 J5 D2 dResponse.CacheC;% K$ ]% j* [) l6 F5 k! a ( B6 i3 Z9 `0 M$ Q- W! s3 {# Y究竟怎样才能"禁用"浏览器的后退按钮?或者“怎样才能防止用户点击后退按钮返回以前浏览过的页面?”+ g7 o4 Z2 S0 T/ m. @( I 6 o, e$ s, g5 K8 H 遗憾的是,我们无法禁用浏览器的后退按钮。/ B1 X2 @2 p) z % _( \$ _5 a' k防止网页后退--新开窗口 4 ~5 q, V9 @7 x6 w, k( e 9 ^0 A2 R% q( s1 s( V- |& Y用window.open弹出表单页面,点提交后关闭该页;处理提交的ASP页也是用弹出,设定表单的target,点提交时window.open("XXX.asp","_blank"),然后用JS来提交表单,完成后window.close();+ e! H8 U1 o4 M' i 简单的说,就是提交表单的时候弹出新窗口,关闭本窗口。对于window.open()打开的窗口怎么后退?能后退到哪里去?. A9 @; g7 m6 L `: U6 Z( y4 p0 _ 8 D9 ?& G) w+ s又一个新方法,放在ASP页面前面就可以了,其他如JSP也可以仿照一下~~' |" U* @7 ?# d5 X1 m$ ] 7 Y b1 h2 w1 B4 L+ A <% : D4 O2 j" @- e$ F. _( ~3 Fdim RefreshIntervalTime 8 D6 ^6 C: U# i! g n9 hRefreshIntervalTime = 3 '防止刷新的时间秒数,0表示不防止& O0 K- u& ^) |3 B I4 n If Not IsEmpty(Session("visit")) and isnumeric(Session("visit")) and int(RefreshIntervalTime) > 0 Then / t& b9 |0 [6 b. Z& i3 g' W( uif (timer()-int(Session("visit")))*1000 < RefreshIntervalTime * 1000 then l6 W( P, M' {- C Response.write ("<meta http-equiv=""refresh"" c"& RefreshIntervalTime &""" />") 6 i* B* H' _4 W# s) u Response.write ("刷新过快,请稍候") 9 c% ?( H- X' Q4 @5 k& A6 @9 e Session("visit") = timer()' H+ ?, V, ~3 Z. U Response.end 7 |* Q* P5 A7 @3 X( p7 y8 |* Wend if " t* i! t9 k) j) F1 N4 Z2 rEnd If 7 r2 x' @1 {' g$ o; c! n0 @8 vSession("visit") = timer() , o( A F$ l+ F3 x! z%>
遨海湾-心灵的港湾 www.aosea.com
 楼主| 发表于 2008-1-9 10:11:00 | 显示全部楼层

5秒内不能刷新本页

<% % r3 ~+ c& r) d6 T. o. Z if DateDiff("s",session("time"),now())<5 then + n& i- ?1 A4 y0 ~3 h4 ]% Y( L& ] response.write("<script>alert('不能在5秒内重新打开此页');</script") " @6 U. F# G3 p else 5 V9 ^7 i- Z# l* P4 D7 G session("time")=now(); 8 z. T. w1 n% x end if : k8 F) t% n8 w0 D; s/ s8 u$ E %>
遨海湾-心灵的港湾 www.aosea.com
回复

使用道具 举报

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

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

用ASP.NET开发的人对服务器端控件事件引起的页面刷新很头痛吧! 1 B C* A0 t! D- U ) _% g" @, f2 t+ O; q; H& a) F/ O 1 ^" d4 [5 ?6 s" _ ! N4 s3 x: m, H% r8 b( G8 x 我把解决问题的方法拿出来与大家共享,思路是事件执行完后写段脚本,让页面自动滚动到刷新页面之前的控件处,减少页面刷新 & L% o2 H9 L" N' N8 \- u* c 带来的不便。 ( f# F5 W9 x! U3 N2 p2 P B0 Z% |! v$ W# p% Z$ n 比如按了一个按钮后,脚本会自动将页面自动滚动到这个按钮的位置。 # |& e7 N5 U6 B# V! {* u+ i* ` , o+ g$ {9 R8 Q- e; Z @! J* x* G" A3 t, b! u , [$ m- T9 E# G7 v* y 写段脚本的事情,用了一个ScriptHelper的类来搞定,这个类有个GetViewControlScript(string controlName)的方法,它返回是 ! T& i1 r \5 S" ^ 一段客户端的脚本,传入的参数就是这个控件的ID。 5 h& a+ c# |) A ScriptHelper类代码: 0 s9 f3 a! U+ Q% ^ /// <summary> 0 C- ?$ l z" ~# z( b: A* g /// 提供一些产生页面脚本的方法 ) r G( f# f5 B$ |! p, p) } /// </summary> " t8 Q( h$ _2 \$ t) | public class ScriptHelper 1 c: @# X2 X. _ T- r { $ J: k$ z2 I% q- K% J! a ) [( ]9 ?+ W) y6 j ?" `% I  /// <summary> @/ ]2 V c: d8 k) K4 E B  /// 获取客户端查看控件的脚本 4 P" g8 g$ g* A2 f  /// </summary> 5 @- o- Y$ I0 F6 T2 R% J; q  /// <param name="controlName"></param> 3 D; V* r: ^& c: G' X* N$ R  /// <returns>脚本代码</returns> : k+ z' W# ?2 o# e/ H6 q  public static string GetViewControlScript(string controlName) 5 a( `* t! p# h3 V/ r  { ) B1 s1 s- y1 p9 Q2 R 6 }0 K" B0 o1 `+ d/ y   //创建客户端函数ViewObj 5 p* O; m, ~$ F; B   string script = "\n"; 4 h t" C' q% o( |( W   script += "<script language=\"javascript\">\n"; ' D2 V* `$ H0 X$ L) h. P   script += "function ViewObj(objName)\n"; % y8 s9 M" ?/ N5 C" b   script += "{\n"; : h) s4 v0 p: ]. y$ F1 u   script += "var obj = document.all.item(objName);\n"; ( D. T6 [6 ~4 X( F/ K   script += "if (obj != null)\n"; 1 C" U$ ~3 t w6 }   script += "{\n"; 7 i6 a8 g& r0 i( \   script += "\tobj.scrollIntoView();\n"; + ~7 j% d6 L+ \! E   script += "\tobj.focus();\n"; 6 ?! C$ f4 }' ]) B0 y3 {1 F   script += "}\n"; Z( y( y1 S& x) _   script += "}\n"; ' O* b5 p" y; y& B6 G* C$ Q . t, H3 F) w; l. L //创建客户端函数ToDo ! k, K; q7 T' I. f. L6 V   script += "function ToDo()"; t, l' l3 C. v, a2 s   script += "{\n"; 8 f( j% \5 u- P0 s6 m1 ~: P, s+ w   script += string.Format("setTimeout(\"ViewObj('{0}')\",1000);\n", controlName); - X* l w8 x6 a6 ^1 M   script += "}\n"; , `; p. n4 o& v& j# Y' o* h 4 a* u: K! d; \3 K9 q0 L3 u% L   script += "window.onload = ToDo;\n"; % ?6 E/ V% n0 i2 z   script += "</script>\n"; 3 ]( V+ {" s4 ?( n + x0 m+ s: X0 L& N6 u4 B   return script; / ^. ~. ~& N9 ]. X" s; ^& X: \# I  } y6 Q% X8 w0 L7 l' C ; q" J' x- W: i# {7 B$ m! ?8 s* s } 4 {. Q" e! [" n8 B 8 i3 u! m4 Y7 F* d8 n5 ]" X& e 使用示例: # R( D- f) w) F2 s$ t5 |& { $ O7 c, M3 `8 e! B4 ] t8 n: K5 W 为了方便输入脚本,我在页面上放了个Label:lblScript,并把lblScript的EnableViewState属性和Visible属性设成False。 5 S( @9 x6 u+ p- G 2 n% j# J1 C! H ] 然后在lblScrpt的Click事件的操作代码后添加输入脚本的代码,如下所示: : u, r( V" ?/ u' A/ c7 K9 V1 k8 ~# j1 a private void btnSave_Click(object sender, System.EventArgs e) ' Y7 L1 |8 W, T/ E+ k# E, M; E( V { 4 Q0 ~6 _! a5 g( ^$ q2 n/ f- F project.UpdateProjectInfo(ds); % }& j# ^$ j9 ]+ p2 X lblScript.Text = ScriptHelper.GetViewControlScript("btnSave"); 4 O" S# I% S3 K0 u' ]5 a+ p& D } 1 H% z f, [ @6 [* H; L" ~ ! f! f+ u- ]5 c% c( e 在点击btnSave按钮后,页面会自动滚动到btnSave的位置,减少了页面刷新带来的不便。 ; o4 x+ z1 i5 ^# m:+ 3 F6 r' x: D( i8 H4 E+ F# [或者: & s% {' W3 p: f4 L; x1 I/ T- S% ` R/ g1 F3 U 在page_load()中增加判断 * M \ s! N6 s3 u9 K6 f8 x if(!Page.IsPoastBack) 5 A" |" c, x, z$ Q* B8 w+ b { 0 ?, a) f6 e4 w% g6 A //初始化页面内容; o) L6 a+ ~7 t) @# M. w }
遨海湾-心灵的港湾 www.aosea.com
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-10 19:12

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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