首页  >  文章  >  web前端  >  全面考察“禁用浏览器后退”_CSS/HTML

全面考察“禁用浏览器后退”_CSS/HTML

WBOY
WBOY原创
2016-05-16 12:10:421511浏览

浏览器的后退按钮使得我们能够方便地返回以前访问过的页面,它无疑非常有用。但有时候我们不得不关闭这个功能,以
防止用户打乱预定的页面访问次序。本文介绍网络上可找到的各种禁用浏览器后退按钮方案,分析它们各自的优缺点和适
用场合。 
一、概述 
   曾经有许多人问起,“怎样才能‘禁用'浏览器的后退按钮?”,或者“怎样才能防止用户点击后退按钮返回以前浏
览过的页面?”在ASP论坛上,这个问题也是问得最多的问题之一。遗憾的是,答案非常简单:我们无法禁用浏览器的后退
按钮。 
   起先我对于居然有人想要禁用浏览器的后退按钮感到不可思议。后来,看到竟然有那么多的人想要禁用这个后退按
钮,我也就释然(想要禁用的只有后退按钮,不包括浏览器的前进按钮)。因为在默认情况下,用户提交表单之后可以通
过后退按钮返回表单页面(而不是使用“编辑”按钮!),然后再次编辑并提交表单向数据库插入新的记录。这是我们不
愿看到的。 
   因此我就决定要找出避免出现这种情况的方法。我访问了许多网站,参考了这些网站所介绍的各种实现方法。如果你
经常访问ASP编程网站,本文所介绍的部分内容你可能已经见到过。本文的任务是把各种可能的方法都介绍给大家,然后找
出最好的方法! 
二、禁止缓存 
   在我找到的许多方案中,其中有一种建议禁止页面缓存。具体是使用服务器端脚本,如下所示: 
Response.Buffer = True 
Response.ExpiresAbsolute = Now() - 1 
Response.Expires = 0 
Response.CacheControl = "no-cache" 
%> 
   这种方法非常有效!它强制浏览器重新访问服务器下载页面,而不是从缓存读取页面。使用这种方法时,编程者的主
要任务是创建一个会话级的变量,通过这个变量确定用户是否仍旧可以查看那个不适合通过后退按钮访问的页面。由于浏
览器不再缓存这个页面,当用户点击后退按钮时浏览器将重新下载该页面,此时程序就可以检查那个会话变量,看看是否
应该允许用户打开这个页面。 
   例如,假设我们有如下表单: 
Response.Buffer = True 
Response.ExpiresAbsolute = Now() - 1 
Response.Expires = 0 
Response.CacheControl = "no-cache" 
If Len(Session("FirstTimeToPage")) > 0 then 
&single; 用户已经访问过当前页面,现在是再次返回访问。 
&single; 清除会话变量,将用户重定向到登录页面。 
Session("FirstTimeToPage") = "" 
Response.Redirect "/Bar.asp" 
Response.End 
End If 
&single; 如果程序运行到这里,说明用户能够查看当前页面 
&single; 以下开始创建表单 
%> 

 
 
 
   我们借助会话变量FirstTimeToPage检查用户是否是第一次访问当前页面。如果不是第一次(即Session
("FirstTimeToPage")包含某个值),那么我们就清除会话变量的值,然后把用户重新定向到一个开始页面。这样,当表单
提交时(此时SompePage.asp被打开),我们必须赋予FirstTimeToPage一个值。即,在SomePage.asp中我们需要加上下面
的代码: 
Session("FirstTimeToPage") = "NO" 
   这样,已经打开SomePage.asp的用户如果点击后退按钮,浏览器将重新请求服务器下载页面,服务器检查到Session
("FirstTimeToPage")包含了一个值,于是就清除Session("FirstTimeToPage"),并把用户重定向到其他页面。当然,所有
这一切都需要用户启用了Cookie,否则会话变量将是无效的。(이 문제에 대한 자세한 설명은
세션 변수가 작동하려면 웹 방문자가 쿠키를 활성화해야 합니까?를 참조하세요.)
또한 클라이언트측 코드를 사용하여 브라우저가 웹 페이지를 캐싱하는 것을 방지할 수도 있습니다.






위의 방법을 사용하여 브라우저를 강제로 실행하는 경우 더 이상 캐시하지 않음 웹 페이지의 경우 다음 사항에 주의해야 합니다.
"Pragma: no-cache"는 보안 연결을 사용할 때 브라우저가 페이지를 캐시하는 것을 방지할 뿐입니다. 보안으로 보호되지 않는 페이지의 경우 "Pragma: no-cache"
는 "Expires: -1"과 동일한 것으로 간주되지만, 브라우저는 여전히 페이지를 캐시하지만 페이지가 즉시 만료되는 것으로 표시합니다.
IE 4 또는 5에서는 "Cache-Control" META HTTP-EQUIV 태그가 무시되고 아무런 효과가 없습니다.
실제 애플리케이션에서는 이러한 코드를 모두 추가할 수 있습니다. 그러나 이 방법은 모든 브라우저에서 작동하지 않으므로 권장하지 않습니다. 하지만
인트라넷 환경이고 사용자가 어떤 브라우저를 사용할지 관리자가 통제할 수 있다면, 아직도 이 방법을 사용하는 분들이 계실 거라 생각합니다.
3. 기타 방법
다음에 논의할 방법은 브라우저 캐시가 아닌 뒤로 버튼 자체에 관한 것입니다. 다음은
참고할 만한 Rewiring the Back Button 기사입니다. 그러나 이 방법을 사용하면 사용자가 뒤로 버튼을 클릭할 때 이전에 데이터를 입력한 페이지가 표시되지 않지만
을 두 번만 클릭하면 되는 것으로 나타났습니다. 이는 우리가 원하는 효과가 아니기 때문입니다. 완고한 사용자는 예방 조치에 대한 방법을 찾을 수 있는 경우가 많습니다.
뒤로 버튼을 비활성화하는 또 다른 방법은 클라이언트 측 JavaScript를 사용하여 도구 모음 없이 창을 여는 것입니다. 이렇게 하면 사용자가 이전 페이지로 돌아가기가 어렵지만
불가능하지는 않습니다. 더 안전하지만 다소 귀찮은 방법은 양식이 제출될 때 새 창을 열고 동시에 양식이 있는 창을 닫는 것입니다. 하지만
사용자가 양식을 제출할 때마다 새 창을 열도록 할 수는 없기 때문에 이 방법은 진지하게 고려할 가치가 없다고 생각합니다.
그러면 사용자가 다시 방문하지 않기를 원하는 페이지에 JavaScript 코드를 추가할 수도 있나요? 이 페이지에 추가된 JavaScript 코드를 사용하면
앞으로 버튼을 클릭하는 효과를 생성하여 사용자가 뒤로 버튼을 클릭하여 발생하는 작업에 대응할 수 있습니다. 이 기능을 구현하는 데 사용된 JavaScript 코드는 다음과 같습니다
:


다시 말하지만, 이 방법은 효과적이지만 여전히 "최상의 방법"과는 거리가 멀습니다. 나중에 누군가가 location.replace를 사용하여 한
페이지에서 다른 페이지로 이동할 것을 제안하는 것을 보았습니다. 이 방법의 원리는 현재 기록 기록을 새 페이지의 URL로 대체하여 검색 기록에 한 페이지만 남게 하고
뒤로 버튼을 사용할 수 없도록 하는 것입니다. 아마도 이것이 많은 사람들이 찾고 있는 것이라고 생각합니다. 하지만 여전히 모든 상황에서 최선의 접근 방식은 아닙니다. 이
메서드를 사용하는 예는 다음과 같습니다. 이 페이지로 돌아가는 링크 비활성화

다음 링크를 사용해 보세요:
이 페이지로 돌아가는 링크를 비활성화하세요!
이 접근 방식의 단점은 사용자가 한 페이지에서 다른 페이지로 이동할 때마다
클라이언트 코드로 location.history를 지워야 하기 때문에 단순히 Response.Redirect를 사용하는 것이 더 이상 작동하지 않는다는 것입니다. 또한 이 방법은 모든
접속 기록이 아닌 마지막 접속 기록을 삭제한다는 점에 유의하세요.
위 링크를 클릭하시면 간단한 HTML 페이지가 열립니다. 다시 뒤로가기 버튼을 누르면 열려있는 것이 이 페이지가 아닌 이 페이지 이전의
페이지임을 알 수 있습니다! (물론 브라우저에서 클라이언트 측 JavaScript 코드를 활성화해야 합니다.)
신중하게 검색한 후에도 브라우저의 뒤로 버튼을 완전히 비활성화하는 방법을 찾지 못했습니다. 여기에 설명된
모든 방법은 다양한 수준과 방식으로 사용자가 이전 페이지로 돌아가는 것을 방지할 수 있지만 모두 고유한 한계가 있습니다. 뒤로 버튼 <script> <BR><!-- <BR>javascript:window.history.forward(1); <BR>//--> <BR></script>을 완전히 비활성화할 수 있는 방법은 없으므로 가장 좋은 해결책은 클라이언트 측 스크립트와 서버 측 스크립트를 혼합하여 사용하는 것입니다.
声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn