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
函数:如下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, mtCookieDomain, location.protocol == 'https:'); } } ```
修改
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 无果, 最后又回归到了原来的模式,仔细研究了一下直接访问 302
的 cookie
设定:
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
,必须知道原来设置的path
和domain
,不然会认为是完全不同的两个cookie
, 而悲催的事情是 js 无法获知原来设置的 cookie 的path
和domain
的。
原因知道了,只好硬编码了。幸好 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
) 设定不同的 path
和 domain
呢? 费解。
修改 Markdown.pl 居然不生效。。晕了
技术流啊,表示看不懂……
惭愧,站务日志罢了。
[挖鼻屎]
增加了代码加亮功能