构建不依赖于cookie的手机端用户登录机制

本文永久链接:http://comdeng.com/blog/article/10023.html

手机端登录网站的问题是一个困扰我很久的问题。总是会有那么一些用户告诉我,他的手机不能登录网站了。要想能有效地解决手机登录的问题,一种方案就是尽可 能多地模拟出用户的手机端环境出来,针对这些具体的环境对代码进行测试和调整。另一种方案就是尽可能地让网站摆脱对于客户端cookie环境的依赖,创建更加健壮的代码。

随着信息技术的发展,手机本身的硬件设备越来越先进,功能也越来越全面,对于cookie的支持显然不成问题。不过,总还是有一部分人群在使用着比较低端 的手机。做为开发者来说,要能最大范围地满足不同手机用户的需求,就不得不考虑对于不支持cookie的手机的支持。否则,你可能不得不一遍又一遍地对用 户说,我们的网站支持带有cookie功能的手机,甚至还得对着用户解释半天什么是cookie。

那么,现在就来看看我们需要为创建不依赖于cookie的手机端用户登录机制需要做哪些准备。

一、了解php对于session机制的支持

php.ini中关于session的几个有用的字段:

session.use_trans_sid 通过开启这个参数,即可启用通过url参数传递sessionId的支持。默认值为0,不开启。

url_rewriter.tags 哪些地方需要用来传递sessionId。默认值为”a=href,area=href,frame=src,input=src,form=fakeentry”,表示在标签a=href表示对于标签a的href属性,要将sessionId附加上去。

session.use_cookies 默认的值是“1”,代表sessionId使用Cookie来传递,反之就是使用url参数来传递。如果session.use_trans_sid=1,那么启用该选项,在客户端支持cookie的情况下,仍然使用cookie传递sessionId,在检测到客户端不支持cookie的情况下,则会使用url参数传递sessionId。

session.name 这个就是SessionID储存的变量名称,默认为PHPSESSID

session.cookie_lifetime 这个代表SessionID在客户端Cookie储存的时间,默认是0,代表浏览器一关闭sessionId就作废。

session.gc_maxlifetime 这个是Session数据在服务器端储存的时间,如果超过这个时间,那么Session数据就自动删除。

session.save_path session的保存路径。默认为/tmp。如果在路径前加2;则表示cookie的存储深度为2。比如如果session.sava_path=2;/tmp/session,那么sess_005c685e3ec4e0cf6b667245225299c8这个session就会保存在/tmp/session/0/0/这个目录下。

二、基本使用方法

新建一个session.php文件,代码为:

<a href=”hello.php”>hello</a>

最后输出来的时候链接地址无疑还是hello.php,那么,我们来增加几行代码,让它变得能支持传递sessionId。

<?php
ini_set('session.use_trans_sid',1);
?>
<a href=”hello.php”>hello</a>

在浏览器中看的时候,链接还是没有变化。怎么回事呢?原来服务器端在检测到浏览器端支持cookie的情况下,是不会开启url传递sessionId的。

不妨试试禁用浏览器的cookie。会发现效果依旧。这是怎么回事呢?

实际情况是,要让服务器支持替换链接地址,首先要让服务器能获取到sessionId。那么我们就要开启session才行。这时就要用到session_start函数了。再修改一下代码如下:

<?php
ini_set('session.use_trans_sid',1);
session_start();
?>
<a href="/hello.php">hello</a>刷新一下界面,发现生成的源代码已经变成如下的代码了。
<a href="/hello.php?PHPSESSID=f10962d83fdfb27b501b53e099916a90">hello</a>

那么恭喜,我们的目标已经基本完成了。

在前面的代码中,我们都是直接在代码中使用ini_set函数对php.ini的字段进行设置,这样做有什么好处呢?因为在实际的服务器环境中,可能会运行多个网站,修改php.ini中的配置会直接影响到其他网站的运行,而是用在代码中设置则能在最大程度上削弱这种影响。

三、如何确保各种标签传递sessionId

在前面的例子中,我们已经能让a标签的href属性正确地附加上sessionId了。不过,在实际的开发中,可能会有更加复杂的情况。比如,你可能会用到form,也有可能用到iframe,甚至即使在使用图片的时候也需要传递sessionId。那么来看下面的代码:

<?php
    ini_set('session.use_trans_sid',1);
    session_start();
?>
<a href="/hello.php">hello</a>
<form>
<input value="submit"/>
</form>
<iframe src="/hello.php"></iframe>
<img src="/a.gif"/>

刷新界面后,输出的代码为:

<a href="/hello.php?PHPSESSID=a1ff38e07c28474b80766ef96ad88013">hello</a>
    <form><input type="hidden" name="PHPSESSID" value="a1ff38e07c28474b80766ef96ad88013" />
    <input type="submit" value="submit"/>
    <iframe src="/hello.php"></iframe>
    <img src="/a.gif" />

也就是说,对form,已经能很好地传递sessionId了,但是对于iframe和img,却还是不能传递sessionId。怎么办呢?难道需要我们手动来赋值?

其实不然,在第一部分,我们已经提到一个有用的字段了——url_rewriter.tags。我们尝试增加它对于iframe和img的支持。代码如下:

<?php
    ini_set('session.use_trans_sid',1);
    $tags = ini_get('url_rewriter.tags');
    ini_set('url_rewriter.tags',$tags.',iframe=src,img=src');
    session_start();
?>
<a href="/hello.php">hello</a>
<form>
<input value="submit"/>
</form>
<iframe src="/hello.php"></iframe>
<img src="/a.gif" />

输出来的结果如下:

<a href="/hello.php?PHPSESSID=a1ff38e07c28474b80766ef96ad88013">hello</a>
<form><input type="hidden" name="PHPSESSID" value="a1ff38e07c28474b80766ef96ad88013" />
  <input type="submit" value="submit"/>
</form>
<iframe src="/hello.php?PHPSESSID=a1ff38e07c28474b80766ef96ad88013"></iframe>
<img src="/a.gif?PHPSESSID=a1ff38e07c28474b80766ef96ad88013" />

很显然,iframe和img也能顺利地传递sessionId了。

到此为止,我们已经能解决大部分的问题了。

四、重定向情况下的传递

通过第二部分,我们已经能把页面输出的sessionId传递解决掉了,但这还不是全部。比如,我们经常会通过设置header来进行页面的重定向。

header(‘Location: /hello.php’);

在这种情况下,很显然,php并不会去处理。那么,我们还是需要自己手动来进行调整了。代码如下:

<?php
    ini_set('session.use_trans_sid',1);
    $tags = ini_get('url_rewriter.tags');
    ini_set('url_rewriter.tags',$tags.',iframe=src,img=src');
    session_start();

    function get_redirect_url($url) {
        $sessionkey = ini_get('session.name');
        $sessionId = session_id();
        if (strpos($url,'?') !== false) {
            $tag = '&';
        } else {
            $tag = '?';
        }
        $url .= $tag.$sessionKey.'='.$sessionId;
        return $url;
    }

    $rurl = get_redirect_url('/hello.php');
    header('Location: '.$rurl);
?>

通过get_redirect_url函数,我们就能将重定向的网址也支持传递sessionId了。

太好了,又解决了一种情况。

五、wap1.x的特殊情况

不过,在wap1.x下使用wml开发的时候,还有一些特殊的情况。比如,url中的&需要转化为&amp;,否则浏览器解释的时候就会报错。因此,对于页面标签和重定向的情况,我们都需要针对wap1.x的页面做特殊处理。

重定向的情况很好处理,将第四部分的get_redirect_url函数中的$tag=’&’,在wap1.x的环境中替换为$tag=’&amp;’即可。不过对于界面标签的处理,则需要我们引入一条新的配置项——arg_separator.output。这个配置项用来指定当在url中加入sessionId参数时,使用什么样的连字符,默认值是&。那么,在已知处于wap1.x环境时,加入如下的语句即可逢凶化吉了:

ini_set('arg_separator.output','&amp;');

好了,到此为止,我们已经基本上能解决掉wap开发中使用url传递sessionId的大部分情况了。看似内容比较多,实际上就介绍了html标签中url如何传递sessionId和使用重定向时如何传递sessionId两种情况,并对wap1.x环境下的情况做了一些特殊处理,最终确保不依赖于cookie的用户登录机制得以实现的过程。希望这些总结的内容对于wap开发者能带来一定的帮助。

分享到QQ空间

Comments are closed.