2014-02-21 445 views
12

如何在用户注销后停止后退按钮? (注销按钮在母版页) 使用web表单如何在注销后防止浏览器返回按钮?

我有几页,最后一页是最后一页,然后注销后,当我点击后退按钮显示其先前page.How我该避免this.Pls帮助我的代码

代码需要触发后才注销.The用户必须能够回去N参看前一页,如果他有做任何修改,而他的真实loged。

+0

你使用Webforms或MVC吗?我的想法是检查用户是否登录或者不在你想要保护的页面上(比如这个'上一页')。 @PatrickHofman答案中的链接导致结果说**后退按钮历史不是缓存** – TheGeekZn

+0

即时通讯使用Webforms .. –

+0

** [检查了这一点](http://www.hunlock.com/blogs/Mastering_The_Back_Button_With_Javascript )。**可能有帮助。 – Bhavik

回答

0
function preventBack(){window.history.forward();} 
    setTimeout("preventBack()", 0); 
    window.onunload=function(){null}; 
0
<script> 
    function preventBack(){window.history.forward();} 
    setTimeout("preventBack()", 0); 
    window.onunload=function(){null}; 
</script> 

它可能适合你

+0

任何人都可以在其中禁用Javascript浏览器,并且一些浏览器在默认情况下会这样做:) – TheGeekZn

+0

我可以在母版页中给它吗?这需要在注销后触发。如果用户在登入时必须进行任何更改,用户必须能够返回到前一页。 –

+0

只应在注销页面中执行 –

18

您应该设置正确的HTML标头。据this这些都是在所有浏览器的工作的:

Cache-Control: no-cache, no-store, must-revalidate 
Pragma: no-cache 
Expires: 0 

你可以将它们像这样:

HttpContext.Current.Response.AddHeader("Cache-Control", "no-cache, no-store, must-revalidate"); 
HttpContext.Current.Response.AddHeader("Pragma", "no-cache"); 
HttpContext.Current.Response.AddHeader("Expires", "0"); 
+0

我在哪里添加那段代码?在注销按钮中? –

+0

你可以在你的ASP.NET请求中(在'Page_Load'应该工作,我认为)在代码中设置它。 –

+0

需要更多帮助? –

0

这种做法将只能与MVC网站工作

这是我使用的方法

将以下过滤器添加到您的FilterConfig(假设您使用的是MVC)

filters.Add(new System.Web.Mvc.AuthorizeAttribute()); 

现在装饰作用的方法用户可以使用不被记录在

[AllowAnonymous] 

一定要装饰你登录和注册方法。

现在,当用户点击回来(假设页面刷新),他们将被要求再次登录。 我不允许在后退按钮上强制刷新页面。

希望这有助于你一点

+0

OP没有说他们使用MVC而不是webforms,请一旦建立就更新您的答案。 – jacqijvv

+1

OP没有说他们没有使用MVC。另外我在回答中说我假设他们是。所以如果他们不使用MVC他们可以忽略我的答案。 – KevDevMan

0

即使后退按钮在

我使用的会话变量,也是我禁用缓存

浏览器(在克罗姆测试)按工作完美

第1页(default.aspx)登录表格,我收集会话变量ID

Session["id"] = TextBox1.Text;// just the username</pre> 

    page 2(Default2.aspx) in page load 
     protected void Page_Load(object sender, EventArgs e) 
     { 
      Response.Cache.SetCacheability(HttpCacheability.NoCache); 
      Response.Cache.SetExpires(DateTime.Now.AddDays(-1)); 
      Response.Cache.SetNoStore(); 

       if (Session["id"] == null) 
       {  

        Response.Redirect("Default.aspx");// redirects to page1(default.aspx) 

       } 
       else 
       { 
        Label1.Text = (string)Session["id"];//just display user name in label 

       } 

     } 

在第2页注销按钮

 protected void Button1_Click(object sender, EventArgs e) 
     { 
      Session["id"] = null; 

      Response.Redirect("/WebSite5/Default.aspx");//redirects to page1(default.aspx) 
     } 
0

尝试了很多解决方案,但只有下面的解决方案。在注销页面中添加下面的Java脚本。所有其他解决方案将在比IE

window.onunload = function() { 
       window.location.href = "<%=request.getContextPath()%>/logout.jsp"; 
      }; 
0

我知道这是一个古老的线程其他浏览器正常工作,但有人可能会帮助这一点。您可以通过使用javascript事件windows.hash更改来防止后退按钮。

<script> 
 
     var history_api = typeof history.pushState !== 'undefined'; 
 
     if (location.hash == '#no-back') { 
 
      if (history_api) history.pushState(null, '', '#stay') 
 
      else location.hash = '#stay' 
 
    
 
      window.onhashchange = function() { 
 
       if (location.hash == '#no-back') { 
 
        alert('Action cannot be done!'); 
 
        if (history_api) history.pushState(null, '', '#stay') 
 
        else location.hash = '#stay' 
 
       } 
 
      } 
 
     } 
 
</script>

您可以访问here为完整的教程

0

试试这个我觉得为防止被这种最好的方式。在codeproject中得到了这个解决方案。

使用这些常用方法注销时清除会话值。

Session.Abandon(); 
Session.Clear(); 
Session.RemoveAll(); 
System.Web.Security.FormsAuthentication.SignOut(); 
Response.Redirect("frmLogin.aspx", false); 

在ASPX页面上,我使用带有JSON的Jquery并使用LogoutCheck()WebMethod检查Session值。

<script type="text/javascript"> 
    $(document).ready(function() { 
     CheckingSeassion(); 
    }); 
    function CheckingSeassion() { 
     $.ajax({ 
      type: "POST", 
      url: "frmLogout.aspx/LogoutCheck", 
      data: "{}", 
      contentType: "application/json; charset=utf-8", 
      dataType: "json", 
      success: function (response) { 
       if (response.d == 0) { 
        window.location = '<%= BaseURL %>' + "frmLogin.aspx"; 
       } 
      }, 
      failure: function (msg) { 
       alert(msg); 
      } 
     }); 
    } 

的LogoutCheck()的WebMethod检查从应用程序服务器上的客户端负载力矩会话值。

我创建frmLogout.aspx页面上此方法是这样的:

[WebMethod] 
public static int LogoutCheck() 
{ 
    if (HttpContext.Current.Session["user"] == null) 
    { 
     return 0; 
    } 
    return 1; 
} 

现在,当用户注销页面,它重定向到注销页面并清除并放弃该会话的值。现在,当用户单击浏览器的后退按钮时,客户端仅加载,并且在此期间,CheckingSession()WebMethod在JQuery中触发,并检查会话值LogoutCheck()WebMethod。由于会话为空,该方法返回零,并且页面在登录页面中再次重定向。所以,我不必清除缓存或清除用户浏览器的任何历史记录。

相关问题