构建不依赖于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开发者能带来一定的帮助。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值