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,不就和原来逻辑一样了吗? 这样,点“退出”的时候页面不会跳转,会友好的多。
修改如下:
- 增加
clear_login_cookie
函数:如下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, mtCookieDomain,
location.protocol == 'https:');
}
} - 修改
mtSignOut
函数。
定位location.href = url;
修改为:
//location.href = url;
clear_login_cookie();
$.get(url, {ajax:'1'});
mtFireEvent('usersignin');
以为万事大吉,结果,运行之,发现虽然显示退出了, 但是mt_commenter
","commenter_name
","commenter_id
三个 cookie 并没有清理掉???
多处 Debug 无果, 最后又回归到了原来的模式,仔细研究了一下直接访问 302
的 cookie
设定:
mt_commenter
=; path=/; expires=Fri, 25-Sep-2015 02:02:10 GMTcommenter_name
=; path=/; expires=Fri, 25-Sep-2015 02:02:10 GMTcommenter_id
=; path=/; expires=Fri, 25-Sep-2015 02:02:10 GMT
呃,貌似根本没有 CookieDomain
设定。。。。
根本原因在于:
> JS如果要删除(重新设置)某个 cookie
,必须知道原来设置的 path
和 domain
,不然会认为是完全不同的两个 cookie
, 而悲催的事情是 js 无法获知原来设置的 cookie 的 path
和 domain
的。
原因知道了,只好硬编码了。幸好 mtCookiePath
定义的本身就是 /
,回到 function clear_login_cookie()
,重写如下:
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
) 设定不同的 path
和 domain
呢? 费解。
目测文章没有添加 more 标签截断。
是的, 因为 MT 没有 more 标签概念,所以很不习惯加这个标签。