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

This is a sitelog of Easun.org.

话说: Movable Type 用户登录后退出貌似是http://easun.org/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 呢? 费解。