브라우저의 뒤로 버튼 비활성화
브라우저의 [뒤로(Back)]버튼을 무효로 하는 방법(브라우저 전체)
예상되는 브라우저 동작을 디세블로 하지 마십시오.
사용자가 1~2페이지로 돌아갈 가능성을 페이지에 처리하도록 합니다.소프트웨어를 망가뜨리려고 하지 마세요.
JavaScript를 사용하여 뒤로 버튼을 비활성화하는 작은 해킹이 떠올랐습니다.Chrome 10, Firefox 3.6 및 IE9에서 확인했습니다.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<title>Untitled Page</title>
<script type = "text/javascript" >
function changeHashOnLoad() {
window.location.href += "#";
setTimeout("changeHashAgain()", "50");
}
function changeHashAgain() {
window.location.href += "1";
}
var storedHash = window.location.hash;
window.setInterval(function () {
if (window.location.hash != storedHash) {
window.location.hash = storedHash;
}
}, 50);
</script>
</head>
<body onload="changeHashOnLoad(); ">
Try to hit the back button!
</body>
</html>
뭐 하는 거야?
코멘트로부터:
이 스크립트는 브라우저가 URL의 "#" 기호 뒤에 오는 것을 브라우징 기록의 일부로 간주한다는 사실을 활용합니다.동작은 다음과 같습니다.페이지가 로드되면 URL에 "#1"이 추가되고 50밀리초 후에 "1"이 제거됩니다.사용자가 "뒤로"를 클릭하면 브라우저는 URL을 "1"이 제거되기 전의 URL로 되돌립니다. 단, 동일한 웹 페이지이므로 브라우저는 페이지를 다시 로드할 필요가 없습니다.- 요시 샤쇼
다른 사람들은 "이러지 마세요"라고 말하는 접근법을 취했지만, 그것은 포스터의 질문에 실제로 답하지 못한다.모든 사람들이 이것이 나쁜 생각이라는 것을 알고 있다고 가정해 봅시다. 하지만 우리는 어쨌든 그것이 어떻게 이루어졌는지 궁금해요.
사용자의 브라우저에서 뒤로 버튼을 비활성화할 수는 없지만, 사용자가 되돌아갔을 때 응용 프로그램이 중단되도록(오류 메시지를 표시하여 사용자가 다시 시작해야 함) 설정할 수 있습니다.
이를 위해 응용 프로그램 내의 모든 URL과 모든 형식 내에서 토큰을 전달하는 방법이 있습니다.토큰은 모든 페이지에서 재생성되며 사용자가 새 페이지를 로드하면 이전 페이지의 토큰은 모두 비활성화됩니다.
사용자가 페이지를 로드하면 해당 페이지에 올바른 토큰(이전 페이지의 모든 링크/양식에 제공됨)이 전달되었는지 여부만 표시됩니다.
저희 은행에서 제공하는 온라인 뱅킹 애플리케이션은 다음과 같습니다.뒤로 버튼을 전혀 사용하지 않으면 링크가 더 이상 작동하지 않고 페이지 새로고침도 할 수 없습니다.대신 되돌릴 수 없으며 처음부터 다시 시작해야 한다는 알림이 나타납니다.
이 질문은 이것과 매우 유사합니다.
이 작업을 수행하려면 캐시를 강제로 만료해야 합니다.페이지 코드 뒤에 다음 코드를 붙입니다.
Page.Response.Cache.SetCacheability(HttpCacheability.NoCache)
제가 직접 답을 찾고 있는 동안, "베스트 프랙티스"는...구식...브라우저처럼요.(실제로 브라우저는 흉측한 화석입니다)
가장 안전한 해결책은 브라우저가 사용자에게 인터페이스를 제어하는 기능을 부여할 수 있는 메서드/요구를 구현하는 것입니다.
왜일까요? 왜냐하면 현재 프로젝트에서는 100% JavaScript 구축 및 제어 인터페이스를 구축하고 있기 때문입니다.페이지 변경이 없기 때문에 뒤로 버튼은 제 프로젝트에서 사용할 수 없습니다.(즉, 리프레쉬로 인해 페이지 플래시가 발생하지 않습니다.)실제 어플리케이션처럼!)
인터페이스를 「하이잭」하는 기능이 없는 이유를 알고 있습니다.하지만 적어도 브라우저에서 요청할 수 있는 기능은 있어야 합니다.하이잭의 위험이 없다면 그것은 진정한 "베스트 프랙티스"가 될 것입니다.
하지만 브라우저가 브라우저인 건..나는 이 점에 대해 어떤 일이 일어날 것이라고 예상하지 않는다.
같은 질문을 검색하다가 사이트에서 다음 코드를 발견했습니다.여기서 공유하려고 합니다.
function noBack()
{
window.history.forward()
}
noBack();
window.onload = noBack;
window.onpageshow = function(evt){ if(evt.persisted) noBack(); }
window.onunload = function(){ void(0); }
그러나 위의 사용자가 지적한 바와 같이 이는 결코 좋은 방법이 아니며 어떠한 이유로도 피해야 합니다.
클라이언트측 테크놀로지에 의존하면 회피할 수 있습니다.예를 들어 Javascript가 비활성화될 수 있습니다.또는 사용자가 JS 스크립트를 실행하여 제한을 회피할 수 있습니다.
이 작업은 서버 측 사용자 세션 추적 및 리디렉션(서버에서처럼)에서만 수행할 수 있습니다.응답이 아닌 전송.사용자/브라우저를 필요한 페이지로 수정합니다.
<body onLoad="if(history.length>0)history.go(+1)">
몇 가지 다른 구현이 있었습니다.IE용 플래시 솔루션과 iframe/frame 솔루션이 있습니다.이것 좀 봐
BTW: 뒤로 버튼을 비활성화(또는 적어도1단계는 방지)하는 타당한 이유가 많이 있습니다.위 기사에서 설명한 해시 솔루션을 구현한 예로서 gmail을 참조하십시오.
구글의 "ajax가 어떻게 back button을 깼는지"는 사용자 테스트와 back button 비활성화 타당성에 대한 많은 기사를 볼 수 있습니다.
저도 같은 문제가 있었습니다만, 이 자바 스크립트 기능을 헤드태그나 에서 사용하면 100% 정상적으로 동작하기 때문에 되돌릴 수 없습니다.
<script type = "text/javascript" >
function preventBack(){window.history.forward();}
setTimeout("preventBack()", 0);
window.onunload=function(){null};
</script>
이 코드를 사용해 보세요.나한테는 통했어기본적으로 페이지가 로드되는 즉시 해시를 변경하고 URL에 "1"을 추가하여 최근 이력 페이지를 변경합니다. 따라서 뒤로 버튼을 누르면 매번 같은 페이지로 리다이렉트 됩니다.
<script type="text/javascript">
var storedHash = window.location.hash;
function changeHashOnLoad() { window.location.hash = "1";}
window.onhashchange = function () {
window.location.hash = storedHash;
}
</script>
<body onload="changeHashOnLoad(); ">
</bod>
적절한 기한이 만료되어 헤더를 캐싱하는 투고를 사용해야 합니다.
브라우저의 뒤로 버튼을 비활성화하는 대신 지원하는 것이 좋습니다.NET 3.5는 브라우저의 뒤로(및 앞으로) 버튼을 매우 잘 처리합니다.Google: "Scriptmanager EnableHistory"에서 검색합니다.브라우저 이력(ScriptManager -> AddHistoryPoint) 및 ASP에 엔트리를 추가하는 사용자 액션을 제어할 수 있습니다.NET 어플리케이션은 사용자가 브라우저의 [Back/Forward]버튼을 클릭할 때마다 이벤트를 수신합니다.이것은 기존의 모든 브라우저에서 동작합니다.
글로벌하게 back 버튼을 디세블로 하는 것은 실제로는 나쁜 관행입니다.단, 경우에 따라서는 뒤로 버튼의 기능이 의미가 없습니다.
페이지 간 원치 않는 탐색을 방지하는 한 가지 방법은 다음과 같습니다.
톱 페이지(파일)top.php):
<?php
session_start();
$_SESSION[pid]++;
echo "top page $_SESSION[pid]";
echo "<BR><a href='secondary.php?pid=$_SESSION[pid]'>secondary page</a>";
?>
보조 페이지(파일)secondary.php):
<?php
session_start();
if ($_SESSION[pid] != $_GET[pid])
header("location: top.php");
else {
echo "secondary page $_SESSION[pid]";
echo "<BR><a href='top.php'>top</a>";
}
?>
그 결과 자신의 링크를 사용하여 맨 위 페이지에서 세컨더리 페이지로 이동하거나 뒤로 이동(예: 취소)할 수 있습니다.단, 선두 페이지로 돌아가면 브라우저의 뒤로 버튼은 세컨더리 페이지로 이동할 수 없습니다.
전에도 같은 상황에 직면했지만...그리고 도움도 받지 못했다.이것들을 시도해봐, 아마 이게 너에게 도움이 될 거야.
로그인 페이지에서<head>태그:
<script type="text/javascript">
window.history.forward();
</script>
[ Logout ]버튼에서 다음을 수행합니다.
protected void Btn_Logout_Click(object sender, EventArgs e)
{
connObj.Close();
Session.Abandon();
Session.RemoveAll();
Session.Clear();
HttpContext.Current.Session.Abandon();
}
로그인 페이지에서 다음과 같이 사용자 이름 텍스트 상자에 초점을 맞췄습니다.
protected void Page_Load(object sender, EventArgs e)
{
_txtUsername.Focus();
}
이게 도움이 되길...:) 이 페이지의 편집 방법을 가르쳐 주세요.
항목을 편집/삭제할 때 페이지가 예기치 않게 리디렉션되지 않도록 웹 앱에서 삭제 및 백스페이스 키를 부드럽게 억제해야 하는 경우 다음 코드를 사용할 수 있습니다.
window.addEventListener('keydown', function(e) {
var key = e.keyCode || e.which;
if (key == 8 /*BACKSPACE*/ || key == 46/*DELETE*/) {
var len=window.location.href.length;
if(window.location.href[len-1]!='#') window.location.href += "#";
}
},false);
이 코드를 사용해 보세요.마스터 페이지에서 이 코드를 구현하기만 하면 모든 페이지에서 사용할 수 있습니다.
<script type="text/javascript">
window.onload = function () {
noBack();
}
function noBack() {
window.history.forward();
}
</script>
<body onpageshow="if (event.persisted) noBack();">
</body>
요시샤쇼's Code의 문제는 페이지가 50밀리초마다 맨 위로 스크롤된다는 것입니다.그래서 나는 그 코드를 수정했다.현재 IE8 이상의 최신 브라우저에서는 정상적으로 동작하고 있습니다.
var storedHash = window.location.hash;
function changeHashOnLoad() {
window.location.href += "#";
setTimeout("changeHashAgain()", "50");
}
function changeHashAgain() {
window.location.href += "1";
}
function restoreHash() {
if (window.location.hash != storedHash) {
window.location.hash = storedHash;
}
}
if (window.addEventListener) {
window.addEventListener("hashchange", function () {
restoreHash();
}, false);
}
else if (window.attachEvent) {
window.attachEvent("onhashchange", function () {
restoreHash();
});
}
$(window).load(function () { changeHashOnLoad(); });
이게 우리한테 효과가 있었던 것 같아.
history.pushState(null, null, $(location).attr('href'));
window.addEventListener('popstate', function () {
history.pushState(null, null, $(location).attr('href'));
});
<script>
$(document).ready(function() {
function disableBack() { window.history.forward() }
window.onload = disableBack();
window.onpageshow = function(evt) { if (evt.persisted) disableBack() }
});
</script>
언급URL : https://stackoverflow.com/questions/961188/disable-browsers-back-button
'programing' 카테고리의 다른 글
| Storyboard 프로토타입 셀(Xcode 6, iOS 8 SDK)에서 UICollectionViewCell contentView 프레임의 자동 크기 조정 문제는 iOS 7에서만 발생합니다. (0) | 2023.04.21 |
|---|---|
| .NET 설정(app.config/web.config/settings).설정) (0) | 2023.04.21 |
| Azure VM 임시 스토리지는 얼마나 일시적입니까? (0) | 2023.04.21 |
| VBA에서 "종료"와 "종료 서브"의 차이점은 무엇입니까? (0) | 2023.04.21 |
| PowerShell을 사용하여 FTP로 파일 업로드 (0) | 2023.04.21 |