如何使用BASIC身份验证从网站注销用户?


279

如果用户使用基本身份验证,是否可以从网站注销用户?

终止会话是不够的,因为一旦用户通过身份验证,每个请求都包含登录信息,那么下次用户使用相同的凭据访问该网站时,该用户便会自动登录。

到目前为止,唯一的解决方案是关闭浏览器,但是从可用性的角度来看,这是不可接受的。


1
只是好奇。为什么要这样做?
DOK

17
能够以其他用户身份登录。
Marko,

16
@DOK-这是一种标准的社交黑客行为:用户应该能够在保持浏览器打开的情况下注销。假设您的一个用户在公共计算机上访问该站点?他们需要显式注销,以便下一个用户无法像他们一样访问该网站。
基思

@DOK还有一个问题是,它使用户无法注销该站点。服务器可以清除授权cookie,甚至会话cookie。但是,当浏览器加载/页面时,它们将自动重新登录。
伊恩·博伊德

我使用的方法是发送虚假请求以注销,但是由于存在严格的限制,即AD中3次登录失败,因此将用户锁定在客户中。因此,建议谨慎使用此方法(发送假请求)。
钱谦超

Answers:


170

基本身份验证并非旨在管理注销。您可以做到,但不能完全自动。

您要做的就是让用户单击注销链接,并以与您发送请求登录的普通401相同的域和相同的URL文件夹级别发送“ 401未经授权”作为响应。

接下来,必须指示他们输入错误的凭据。用户名和密码为空白,作为回应,您将发送回“您已成功注销”页面。错误/空白的凭据将覆盖先前的正确凭据。

简而言之,注销脚本会颠倒登录脚本的逻辑,仅当用户通过正确的凭据时才返回成功页面。

问题是,有些好奇的“不要输入密码”密码框是否可以满足用户的要求。尝试自动填写密码的密码管理器也可以在这里遇到麻烦。

编辑以添加以回应评论:重新登录是一个略有不同的问题(除非您显然需要两步注销/登录)。您必须拒绝(401)第一次尝试访问重新登录链接,而不是接受第二次尝试(可能具有不同的用户名/密码)。有几种方法可以做到这一点。一种方法是在注销链接中包含当前用户名(例如/ relogin?username),并在凭据与用户名匹配时拒绝。


2
我将尝试这种方法。注销的目的(在这种情况下)是使用户能够以其他用户身份登录,因此这是完全可以接受的解决方案。至于自动填充密码,由用户决定是否使用。谢谢
Marko

这仍然是唯一的方法吗?我已经完成了可以正常工作的ASP.Net MVC和jQuery实现,但我仍然不满意:stackoverflow.com/questions/6277919
Keith

@Keith:仍然只有这个和systemPAUSE的答案(并非在所有浏览器上都有效,但在工作时比手动方法更流畅)。
bobince 2011年

16
W3C在HTML规范上非常活跃。但是HTTP规范却日渐衰落。W3C应该在大约二十年前解决了这个问题。随着REST服务的使用不断增加,当今迫切需要一种可靠的本机身份验证方法。
Dojo 2014年

9
在本地主机上的Chrome 46浏览器中,这似乎无法正常工作。Chrome似乎会保留您指定的旧(正确)密码和新密码。导航到注销页面后,Chrome会正确使用新密码,直到您网站上的页面上未经授权的A 401未经授权。在第一个401之后,Chrome恢复为旧的(正确的)密码。因此,它实际上并没有删除密码。
vancan1ty

196

bobince的答案的补充...

使用Ajax,您可以将“注销”链接/按钮连接到Javascript函数。让此函数使用错误的用户名和密码发送XMLHttpRequest。这应该返回401。然后将document.location设置回登录前页面。这样,用户将永远不会在注销过程中看到额外的登录对话框,也不必记住输入错误的凭据。


12
好的破解方法是,对于大多数Web应用程序来说,让用户手动输入错误的凭据可能是不可接受的。
BillMan 2011年

1
只要确保XMLHttpRequest未被设置为异步,否则您可能会发现重定向请求将在注销请求完成之前发生。
davidjb 2014年

5
您也可以使用相同的技巧进行登录。这样,您可以自定义登录对话框,而不必更改服务器的身份验证方法。本文提供了一些好主意:http
//www.peej.co.uk/articles/http-auth-with-html-forms.html

1
@davidjb由于现在已认为不赞成使用同步请求,因此另一种解决方案可能是在异步请求的回调中重定向用户。
海登·希夫

1
David:chrome现在允许XHR使用此功能,我可以确认它仍然可以在chrome canary中使用。bugs.chromium.org/p/chromium/issues/detail?id=435547
CpnCrunch

192

让用户单击指向https:// log:out@example.com/的链接。这将用无效的凭证覆盖现有凭证;将其注销。


19
为什么这一票不能获得更多投票?对我来说似乎是一个简单而可行的解决方案。这种方法是否存在任何已知问题?
amoebe 2014年

35
这在Chrome中将不再起作用,出于安全原因,Chrome会忽略URL中的凭据。
汤姆

5
这对我有用:)我正在使用Chrome版本32.0.1700.102
abottoni 2014年

6
问题:使用39.0版的chrome,当我通过这种方法单击注销链接时,Chrome会记住错误的登录凭据,并在每次加载页面时提示输入新的登录凭据,直到我进入没有任何指定登录凭据的example.com,清除Chrome的记忆。
斯科特

4
嗨,我无法在Chrome上将它用于https。
thienkhoi TRAN

67

您可以完全使用JavaScript做到这一点:

IE具有(长期以来)用于清除基本身份验证缓存的标准API:

document.execCommand("ClearAuthenticationCache")

工作时应返回true。返回false,undefined或在其他浏览器中崩溃。

新的浏览器(截至2012年12月:Chrome,FireFox,Safari)具有“魔术”行为。如果他们看到成功的基本auth请求以及任何其他虚假的用户名(例如logout),他们将清除凭据缓存,并可能将其设置为该新的虚假用户名,您需要确保该用户名不是用于查看内容的有效用户名。

基本示例是:

var p = window.location.protocol + '//'
// current location must return 200 OK for this GET
window.location = window.location.href.replace(p, p + 'logout:password@')

执行上述操作的“异步”方法是使用logout用户名进行AJAX调用。例:

(function(safeLocation){
    var outcome, u, m = "You should be logged out now.";
    // IE has a simple solution for it - API:
    try { outcome = document.execCommand("ClearAuthenticationCache") }catch(e){}
    // Other browsers need a larger solution - AJAX call with special user name - 'logout'.
    if (!outcome) {
        // Let's create an xmlhttp object
        outcome = (function(x){
            if (x) {
                // the reason we use "random" value for password is 
                // that browsers cache requests. changing
                // password effectively behaves like cache-busing.
                x.open("HEAD", safeLocation || location.href, true, "logout", (new Date()).getTime().toString())
                x.send("")
                // x.abort()
                return 1 // this is **speculative** "We are done." 
            } else {
                return
            }
        })(window.XMLHttpRequest ? new window.XMLHttpRequest() : ( window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : u ))
    }
    if (!outcome) {
        m = "Your browser is too old or too weird to support log out functionality. Close all windows and restart the browser."
    }
    alert(m)
    // return !!outcome
})(/*if present URI does not return 200 OK for GET, set some other 200 OK location here*/)

您也可以将其设置为书签:

javascript:(function(c){var a,b="You should be logged out now.";try{a=document.execCommand("ClearAuthenticationCache")}catch(d){}a||((a=window.XMLHttpRequest?new window.XMLHttpRequest:window.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):void 0)?(a.open("HEAD",c||location.href,!0,"logout",(new Date).getTime().toString()),a.send(""),a=1):a=void 0);a||(b="Your browser is too old or too weird to support log out functionality. Close all windows and restart the browser.");alert(b)})(/*pass safeLocation here if you need*/);


1
这是否需要在服务器端对logout用户名和/或注销URL 进行特殊处理?
ulidtko

1
@ulidtko不,不应该-所有处理都是在客户端进行的。唯一需要特殊处理的情况是被叫用户是否logout存在并且恰好具有生成的密码。在几乎不可能的情况下,将用户ID更改为系统中不存在的用户ID。
davidjb 2014年

2
我今天使用了上面的小书签,效果很好。
David Gleba

我用了它,它适用于Chrome和FF。我只需要在logout.php页面上执行额外的“ GET”操作即可清除$ _SESSION。
2015年

2
小书签也可以在Edge上使用。只需使用<a href='javascript:......need*/);'>Logout</a>
Eric

21

确认以下功能适用于Firefox 40,Chrome 44,Opera 31和
IE11。Bowser用于浏览器检测,还使用jQuery。

-secUrl是要注销的受密码保护区域的URL。
-redirUrl是非密码保护区域(注销成功页面)的URL。
-您可能希望增加重定向计时器(当前为200毫秒)。

function logout(secUrl, redirUrl) {
    if (bowser.msie) {
        document.execCommand('ClearAuthenticationCache', 'false');
    } else if (bowser.gecko) {
        $.ajax({
            async: false,
            url: secUrl,
            type: 'GET',
            username: 'logout'
        });
    } else if (bowser.webkit) {
        var xmlhttp = new XMLHttpRequest();
        xmlhttp.open("GET", secUrl, true);
        xmlhttp.setRequestHeader("Authorization", "Basic logout");
        xmlhttp.send();
    } else {
        alert("Logging out automatically is unsupported for " + bowser.name
            + "\nYou must close the browser to log out.");
    }
    setTimeout(function () {
        window.location.href = redirUrl;
    }, 200);
}


这是最全面的答案
belidzs 2015年

是否有任何原因使$.ajax变体为sync(async: false)而xmlhttp变体为异步(truein open())?
Bowi

1
Chrome现在使用渲染引擎Blink,因此您必须更改(bowser.gecko)(bowser.gecko || bowser.blink)
Bowi

1
为什么使用gecko / blink $.ajax和webkit new XMLHttpRequest?gecko / blink是否应该能够做到,XMLHttpRequest而webkit是否也能够做到$.ajax?我很困惑。
RemyNL '18 October

11

这是一个使用jQuery的非常简单的Javascript示例:

function logout(to_url) {
    var out = window.location.href.replace(/:\/\//, '://log:out@');

    jQuery.get(out).error(function() {
        window.location = to_url;
    });
}

该注销用户未再次显示浏览器登录框,然后将其重定向到注销页面


1
window.location = window.location.href.replace(/:\ / \ //,':// log:out @');
sebhaase

10

使用基本身份验证无法直接做到这一点。

HTTP规范中没有服务器可以告诉浏览器停止发送用户已经提供的凭据的机制。

有一些“ hacks”(请参阅​​其他答案),通常涉及使用XMLHttpRequest发送具有错误凭据的HTTP请求以覆盖最初提供的凭据。


12
理论上。从其他答案可以看出,实践证明是相反的。
Stijn de Witt 2014年

2
正如您还可以从其他答案中看到的那样,并不是以可靠,一致和故障安全的方式!
jplandrain

5

这适用于IE / Netscape / Chrome:

      function ClearAuthentication(LogOffPage) 
  {
     var IsInternetExplorer = false;    

     try
     {
         var agt=navigator.userAgent.toLowerCase();
         if (agt.indexOf("msie") != -1) { IsInternetExplorer = true; }
     }
     catch(e)
     {
         IsInternetExplorer = false;    
     };

     if (IsInternetExplorer) 
     {
        // Logoff Internet Explorer
        document.execCommand("ClearAuthenticationCache");
        window.location = LogOffPage;
     }
     else 
     {
        // Logoff every other browsers
    $.ajax({
         username: 'unknown',
         password: 'WrongPassword',
             url: './cgi-bin/PrimoCgi',
         type: 'GET',
         beforeSend: function(xhr)
                 {
            xhr.setRequestHeader("Authorization", "Basic AAAAAAAAAAAAAAAAAAA=");
         },

                 error: function(err)
                 {
                    window.location = LogOffPage;
             }
    });
     }
  }


  $(document).ready(function () 
  {
      $('#Btn1').click(function () 
      {
         // Call Clear Authentication 
         ClearAuthentication("force_logout.html"); 
      });
  });          

5

实际上很简单。

只需在浏览器中访问以下内容并使用错误的凭据即可: http:// username:password@yourdomain.com

那应该“注销您”。


1
但是该用户必须是REAL用户,否则我会收到“ 401未经授权”的信息,但是使用BACK按钮,我能够以以前登录的用户身份继续工作。在Abyss Web服务器X1(2.11.1)上进行了测试
user2956477 '16

1
重复的答案(请参见上面的Matthew Welborn)。
Skippy le Grand Gourou

3

您需要做的是在一些注销URL上重定向用户并返回401 Unauthorized错误。在错误页面上(必须通过基本身份验证才能访问该页面),您需要提供指向主页的完整链接(包括方案和主机名)。用户将单击此链接,浏览器将再次要求提供凭据。

Nginx的示例:

location /logout {
    return 401;
}

error_page 401 /errors/401.html;

location /errors {
    auth_basic off;
    ssi        on;
    ssi_types  text/html;
    alias /home/user/errors;
}

错误页面/home/user/errors/401.html

<!DOCTYPE html>
<p>You're not authorised. <a href="<!--# echo var="scheme" -->://<!--# echo var="host" -->/">Login</a>.</p>

我进一步建议使用http_hostin 401.html而不是简单地使用in host,因为前者还会添加端口号(以防使用非标准端口)
Emil Koutanov

2
function logout() {
  var userAgent = navigator.userAgent.toLowerCase();

  if (userAgent.indexOf("msie") != -1) {
    document.execCommand("ClearAuthenticationCache", false);
  }

  xhr_objectCarte = null;

  if(window.XMLHttpRequest)
    xhr_object = new XMLHttpRequest();
  else if(window.ActiveXObject)
    xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
  else
    alert ("Your browser doesn't support XMLHTTPREQUEST");

  xhr_object.open ('GET', 'http://yourserver.com/rep/index.php', false, 'username', 'password');
  xhr_object.send ("");
  xhr_object = null;

  document.location = 'http://yourserver.com'; 
  return false;
}

2
 function logout(url){
    var str = url.replace("http://", "http://" + new Date().getTime() + "@");
    var xmlhttp;
    if (window.XMLHttpRequest) xmlhttp=new XMLHttpRequest();
    else xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    xmlhttp.onreadystatechange=function()
    {
        if (xmlhttp.readyState==4) location.reload();
    }
    xmlhttp.open("GET",str,true);
    xmlhttp.setRequestHeader("Authorization","Basic xxxxxxxxxx")
    xmlhttp.send();
    return false;
}

2

根据以上内容,我得到了一个适用于任何浏览器的简单解决方案:

1)在注销页面上,您将ajax称为登录后端。您的登录后端必须接受注销用户。后端接受后,浏览器将清除当前用户并假定为“注销”用户。

$.ajax({
    async: false,
    url: 'http://your_login_backend',
    type: 'GET',
    username: 'logout'
});      

setTimeout(function () {
    window.location.href = 'http://normal_index';
}, 200);

2)现在,当用户返回到正常的索引文件时,它将尝试使用用户“注销”自动进入系统,这是您第二次必须使用401答复来阻止它,以调用登录/密码对话框。

3)有很多方法可以做到这一点,我创建了两个登录后端,一种可以接受注销用户,而另一种则不能。我的正常登录页面使用不接受的页面,我的注销页面使用接受的页面。


2

我刚刚在Chrome(79),Firefox(71)和Edge(44)中测试了以下内容,并且工作正常。如上所述,它应用了脚本解决方案。

只需添加“注销”链接,然后单击即可返回以下html

    <div>You have been logged out. Redirecting to home...</div>    

<script>
    var XHR = new XMLHttpRequest();
    XHR.open("GET", "/Home/MyProtectedPage", true, "no user", "no password");
    XHR.send();

    setTimeout(function () {
        window.location.href = "/";
    }, 3000);
</script>

1

此JavaScript必须适用于所有最新版本的浏览器:

//Detect Browser
var isOpera = !!window.opera || navigator.userAgent.indexOf(' OPR/') >= 0;
    // Opera 8.0+ (UA detection to detect Blink/v8-powered Opera)
var isFirefox = typeof InstallTrigger !== 'undefined';   // Firefox 1.0+
var isSafari = Object.prototype.toString.call(window.HTMLElement).indexOf('Constructor') > 0;
    // At least Safari 3+: "[object HTMLElementConstructor]"
var isChrome = !!window.chrome && !isOpera;              // Chrome 1+
var isIE = /*@cc_on!@*/false || !!document.documentMode; // At least IE6
var Host = window.location.host;


//Clear Basic Realm Authentication
if(isIE){
//IE
    document.execCommand("ClearAuthenticationCache");
    window.location = '/';
}
else if(isSafari)
{//Safari. but this works mostly on all browser except chrome
    (function(safeLocation){
        var outcome, u, m = "You should be logged out now.";
        // IE has a simple solution for it - API:
        try { outcome = document.execCommand("ClearAuthenticationCache") }catch(e){}
        // Other browsers need a larger solution - AJAX call with special user name - 'logout'.
        if (!outcome) {
            // Let's create an xmlhttp object
            outcome = (function(x){
                if (x) {
                    // the reason we use "random" value for password is 
                    // that browsers cache requests. changing
                    // password effectively behaves like cache-busing.
                    x.open("HEAD", safeLocation || location.href, true, "logout", (new Date()).getTime().toString())
                    x.send("");
                    // x.abort()
                    return 1 // this is **speculative** "We are done." 
                } else {
                    return
                }
            })(window.XMLHttpRequest ? new window.XMLHttpRequest() : ( window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : u )) 
        }
        if (!outcome) {
            m = "Your browser is too old or too weird to support log out functionality. Close all windows and restart the browser."
        }
        alert(m);
        window.location = '/';
        // return !!outcome
    })(/*if present URI does not return 200 OK for GET, set some other 200 OK location here*/)
}
else{
//Firefox,Chrome
    window.location = 'http://log:out@'+Host+'/';
}


1

chrome://restart在地址栏中输入chrome,然后将其所有应用程序在后台运行,然后重新启动,并清除Auth密码缓存。


1

仅作记录,有一个名为的新HTTP响应标头Clear-Site-Data。如果您的服务器答复中包含Clear-Site-Data: "cookies"标头,则应删除身份验证凭据(不仅是cookie)。我在Chrome 77上进行了测试,但此警告在控制台上显示:

Clear-Site-Data header on 'https://localhost:9443/clear': Cleared data types:
"cookies". Clearing channel IDs and HTTP authentication cache is currently not
supported, as it breaks active network connections.

并且不会删除身份验证凭据,因此(暂时)无法实现基本身份验证注销,但是将来可能会实现。没有在其他浏览器上进行测试。

参考文献:

https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Clear-Site-Data

https://www.w3.org/TR/clear-site-data/

https://github.com/w3c/webappsec-clear-site-data

https://caniuse.com/#feat=mdn-http_headers_clear-site-data_cookies


1

https://invalid_login@hostname除Mac上的Safari以外,其他任何地方都可以正常发送(嗯,未选中Edge,但也应该在那里工作)。

当用户在HTTP基本身份验证弹出窗口中选择“记住密码”时,注销在Safari中不起作用。在这种情况下,密码存储在“钥匙串访问”中(“查找器”>“应用程序”>“实用程序”>“钥匙串访问”(或CMD + SPACE并键入“钥匙串访问”))。发送https://invalid_login@hostname不会影响“钥匙串访问”,因此使用此复选框无法在Mac上的Safari上注销。至少它对我有用。

MacOS Mojave(10.14.6),Safari 12.1.2。

下面的代码对我来说在Firefox(73),Chrome(80)和Safari(12)中运行正常。当用户导航到注销页面时,将执行代码并删除凭据。

    //It should return 401, necessary for Safari only
    const logoutUrl = 'https://example.com/logout'; 
    const xmlHttp = new XMLHttpRequest();
    xmlHttp.open('POST', logoutUrl, true, 'logout');
    xmlHttp.send();

同样由于某些原因,即使选择了“记住密码”,Safari也不会在HTTP基本身份验证弹出窗口中保存凭据。其他浏览器可以正确执行此操作。


0
  • 使用会话ID(cookie)
  • 使服务器上的会话ID无效
  • 不接受具有无效会话ID的用户

当没有cookie时,提供基本身份验证作为备份登录方案也是很好的。
bobince

0

我更新了mthoring针对现代Chrome版本的解决方案:

function logout(secUrl, redirUrl) {
    if (bowser.msie) {
        document.execCommand('ClearAuthenticationCache', 'false');
    } else if (bowser.gecko) {
        $.ajax({
            async: false,
            url: secUrl,
            type: 'GET',
            username: 'logout'
        });
    } else if (bowser.webkit || bowser.chrome) {
        var xmlhttp = new XMLHttpRequest();
        xmlhttp.open(\"GET\", secUrl, true);
        xmlhttp.setRequestHeader(\"Authorization\", \"Basic logout\");\
        xmlhttp.send();
    } else {
// http://stackoverflow.com/questions/5957822/how-to-clear-basic-authentication-details-in-chrome
        redirUrl = url.replace('http://', 'http://' + new Date().getTime() + '@');
    }
    setTimeout(function () {
        window.location.href = redirUrl;
    }, 200);
}

-1
    function logout(secUrl, redirUrl) {
        if (bowser.msie) {
            document.execCommand('ClearAuthenticationCache', 'false');
        } else if (bowser.gecko) {
            $.ajax({
                async: false,
                url: secUrl,
                type: 'GET',
                username: 'logout'
            });
        } else if (bowser.webkit) {
            var xmlhttp = new XMLHttpRequest();
            xmlhttp.open("GET", secUrl, true);
            xmlhttp.setRequestHeader("Authorization", "Basic logout");
            xmlhttp.send();
        } else {
            alert("Logging out automatically is unsupported for " + bowser.name
                + "\nYou must close the browser to log out.");
        }
        setTimeout(function () {
            window.location.href = redirUrl;
        }, 200);
    }

我尝试通过以下方式使用上述方法。

?php
    ob_start();
    session_start();
    require_once 'dbconnect.php';

    // if session is not set this will redirect to login page
    if( !isset($_SESSION['user']) ) {
        header("Location: index.php");
        exit;
    }
    // select loggedin users detail
    $res=mysql_query("SELECT * FROM users WHERE userId=".$_SESSION['user']);
    $userRow=mysql_fetch_array($res);
?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Welcome - <?php echo $userRow['userEmail']; ?></title>
<link rel="stylesheet" href="assets/css/bootstrap.min.css" type="text/css"  />
<link rel="stylesheet" href="style.css" type="text/css" />

    <script src="assets/js/bowser.min.js"></script>
<script>
//function logout(secUrl, redirUrl)
//bowser = require('bowser');
function logout(secUrl, redirUrl) {
alert(redirUrl);
    if (bowser.msie) {
        document.execCommand('ClearAuthenticationCache', 'false');
    } else if (bowser.gecko) {
        $.ajax({
            async: false,
            url: secUrl,
            type: 'GET',
            username: 'logout'
        });
    } else if (bowser.webkit) {
        var xmlhttp = new XMLHttpRequest();
        xmlhttp.open("GET", secUrl, true);
        xmlhttp.setRequestHeader("Authorization", "Basic logout");
        xmlhttp.send();
    } else {
        alert("Logging out automatically is unsupported for " + bowser.name
            + "\nYou must close the browser to log out.");
    }
    window.location.assign(redirUrl);
    /*setTimeout(function () {
        window.location.href = redirUrl;
    }, 200);*/
}


function f1()
    {
       alert("f1 called");
       //form validation that recalls the page showing with supplied inputs.    
    }
</script>
</head>
<body>

    <nav class="navbar navbar-default navbar-fixed-top">
      <div class="container">
        <div class="navbar-header">
          <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
            <span class="sr-only">Toggle navigation</span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
          </button>
          <a class="navbar-brand" href="http://www.codingcage.com">Coding Cage</a>
        </div>
        <div id="navbar" class="navbar-collapse collapse">
          <ul class="nav navbar-nav">
            <li class="active"><a href="http://www.codingcage.com/2015/01/user-registration-and-login-script-using-php-mysql.html">Back to Article</a></li>
            <li><a href="http://www.codingcage.com/search/label/jQuery">jQuery</a></li>
            <li><a href="http://www.codingcage.com/search/label/PHP">PHP</a></li>
          </ul>
          <ul class="nav navbar-nav navbar-right">

            <li class="dropdown">
              <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">
              <span class="glyphicon glyphicon-user"></span>&nbsp;Hi' <?php echo $userRow['userEmail']; ?>&nbsp;<span class="caret"></span></a>
              <ul class="dropdown-menu">
                <li><a href="logout.php?logout"><span class="glyphicon glyphicon-log-out"></span>&nbsp;Sign Out</a></li>
              </ul>
            </li>
          </ul>
        </div><!--/.nav-collapse -->
      </div>
    </nav> 

    <div id="wrapper">

    <div class="container">

        <div class="page-header">
        <h3>Coding Cage - Programming Blog</h3>
        </div>

        <div class="row">
        <div class="col-lg-12" id="div_logout">
        <h1 onclick="logout(window.location.href, 'www.espncricinfo.com')">MichaelA1S1! Click here to see log out functionality upon click inside div</h1>
        </div>
        </div>

    </div>

    </div>

    <script src="assets/jquery-1.11.3-jquery.min.js"></script>
    <script src="assets/js/bootstrap.min.js"></script>


</body>
</html>
<?php ob_end_flush(); ?>

但这只会将您重定向到新位置。没有注销。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.