Movable Type 和 JS 删除 cookie 操作的彎路

This is a sitelog of .

話說: Movable Type 用戶登錄後退出貌似是/path_to_mt/mt.cp?__mode=logout&...

然後 302 回到當前頁面。

這個過程究竟是幹什麼呢? 首先清理掉了 Session,這個是必須服務器支持的。

那麼問題來了, 能不能不 302 ,直接我用 ajax 訪問 上面的那個鍊接 OK ? 測試了一下。貌似 js 清除的 cookie 的值 mt_blog_user 為隻是前台使用的。 後台使用還有 "mt_commenter","commenter_name","commenter_id" 這三個 cookie。 而 302 回原來界面的時候會清除這些 cookie.

知道了答案,于是開始修改,邏輯很清楚,ajax 訪問上面的鍊接,清除服務器Session,然後自己寫JS,清除這些 cookie,不就和原來邏輯一樣了嗎? 這樣,點"退出"的時候頁面不會跳轉,會友好的多。

修改如下:

  1. 增加 clear_login_cookie 函數:如下

    javascriptfunction clear_login_cookie() {
      var name_array = ["mt_commenter","commenter_name","commenter_id"]; 
      var i = name_array.length; 
      while (i--) { 
        var name= name_array[i];
        mtDeleteCookie(name,mtCookiePath, mtCookieDomain,
    location.protocol == 'https:');
      }
     }
    ```
    
  2. 修改 mtSignOut 函數。
    定位 location.href = url; 修改為:

    code//location.href = url;
    clear_login_cookie();
    $.get(url, {ajax:'1'});
    mtFireEvent('usersignin');
    

    以為萬事大吉,結果,運行之,發現雖然顯示退出了, 但是mt_commenter","commenter_name","commenter_id 三個 cookie 并沒有清理掉???

多處 Debug 無果, 最後又回歸到了原來的模式,仔細研究了一下直接訪問 302cookie 設定:

mt_commenter=; path=/; expires=Fri, 25-Sep-2015 02:02:10 GMT

commenter_name=; path=/; expires=Fri, 25-Sep-2015 02:02:10 GMT

commenter_id=; path=/; expires=Fri, 25-Sep-2015 02:02:10 GMT

呃,貌似根本沒有 CookieDomain 設定。。。。 根本原因在于:

JS如果要删除(重新設置)某個 cookie ,必須知道原來設置的 pathdomain,不然會認為是完全不同的兩個 cookie , 而悲催的事情是 js 無法獲知原來設置的 cookie 的 pathdomain的。

原因知道了,隻好硬編碼了。幸好 mtCookiePath 定義的本身就是 /,回到 function clear_login_cookie(),重寫如下:

code    <!--lang:javascript-->
    function clear_login_cookie() {
    var name_array = ["mt_commenter","commenter_name","commenter_id"]; 
    var i = name_array.length; 
    while (i--) { 
     var name= name_array[i];
     mtDeleteCookie(name,mtCookiePath);
     }
    }

再次測試,一切 OK 。 但是彎路浪費了我 N 長時間。 記下來供同好者鑒。

吐槽一下: 為什麼 Movable Type 設定這些 cookie 要和 公開的 cookie (mt_blog_user) 設定不同的 pathdomain 呢? 費解。