1. 程式人生 > >【java細節】詳解如何刪除cookie

【java細節】詳解如何刪除cookie

0x01 背景
最近做專案的登陸登出功能,需要實現單點登入和單點登出,驗證伺服器是一個龐大的第三方開源軟體,軟體的文件也不太全面,並沒有細緻的講解登出方式,導致登出用重定向返回應用後還是登陸狀態,無奈之舉要麼在伺服器端修改session失效時間,要麼看看登陸時候是否攜帶了驗證碼,如果帶了,刪除了看能不能實現登出,畢竟找不到驗證伺服器的登出url。

0x02 cookie無法清除
首先需要明白cookie的屬性不僅僅只有name和value,要刪除cookie也不是僅僅指定cookie的name就可以刪除,還有domain域和path屬性,maxage()表示持續時間。如下圖所示,可以得到的屬性很多。
這裡寫圖片描述


明白以上的知識點後,就會發現,要刪除cookie,應該要指定完整的路徑去刪除;但我遇到的問題是,檢視cookie的domain域和path屬性時,其值均為null,那是不是就不用指定了呢?答案肯定不是。為null時也需要指定,只是指定path時候為“/”。
這裡寫圖片描述

0x03 JAVA程式碼刪除cookie
刪除cookie在前端介面刪除,讓其不帶入request。前端介面可寫”<% %>”標記的java程式碼,也可以寫js程式碼,並且兩種方式都可以刪除。Java刪除程式碼很簡單,將如下程式碼放入介面body標籤內部即可

<%
                Cookie killMyCookie = new
Cookie("cookiename1", null); killMyCookie.setMaxAge(0); killMyCookie.setPath("/"); response.addCookie(killMyCookie); Cookie killMyCookie1 = new Cookie("cookiename2", null); killMyCookie1.setMaxAge(0); killMyCookie1.setPath("/"
); response.addCookie(killMyCookie1); %>

這種方法確實可以刪除cookie,可是他的效果是介面載入後就刪除了,並不是我想要的點選某個按鈕後再刪除,因為當用戶並沒有點選登出,而是到了這個介面後又返回了,不可能讓其自動登出了吧!
只能想辦法將其寫成函式,然後點選呼叫。可是JAVA程式碼和JS程式碼卻不能很好的通訊,那就看看能不能用JS程式碼來刪除cookie,然後將JS程式碼寫成function來呼叫。

0x04 JS程式碼刪除cookie
JAVA程式碼刪除cookie的原理是新建一個同名,值為null的cookie,用這個cookie將request域裡面的指定cookie覆蓋;JS刪除cookie的原理是將cookie的失效時間改變成過去的值。網上很多人的部落格到處轉載,卻大部分是如下形態

function delCookie(name)
{
var exp = new Date();
exp.setTime(exp.getTime() - 1);
var cval=getCookie(name);
if(cval!=null)
document.cookie= name + "="+cval+";expires="+exp.toGMTString();
}

按我之前對cookie的理解,既然我的cookie的domain域和path屬性均為null,我不指定path,只指定name屬性應該也可以自動指向我要刪除的cookie。可是我用以上的程式碼試了一百遍都刪除不了。
於是指定path路徑再次嘗試就刪除了。程式碼如下:

<script type="text/javascript">
    function logoutJS() {
        var date = new Date();
        date.setTime(date.getTime() - 10000);
        document.cookie = "cookiename" + "=v; expire=" + date.toGMTString()
                + "; path=/";
    }
</script>
<form action="logout">
            <input type="submit" value="Logout" onclick="logoutJS()">
</form>

0x05 總結
前端cookie刪除的方法,寫java程式碼和JS程式碼在執行時間上有所不同,需合理選擇。刪除cookie時候,即使path和domain域是null,最好也進行指定,防止出現各種cookie刪除不掉的bug。