不依赖于cookie的手机session解决方案

PHP 解决手机浏览器SESSION问题的方法
<?php
ini_set("arg_separator.output","&"); //用来产生 URL 参数的分割标志,默认是 "&"
ini_set("session.use_cookies",0); //是否使用 cookies
ini_set("session.use_trans_sid",1); //自动传递sessionid
ini_set("session.name","sid"); //设置传递session的名字
ini_set("url_rewriter.tags","a=href,go=href,area=href,frame=src,input=src,form=,fieldset="); //标签重定义
session_start();
?>
Wap网站处理用户登录session问题要比普通html页面的网站麻烦一些。因为有不少手机不支持cookie。而sessionid默认是通过cookie来存储和传递的。
解决wap站的session问题可以使用URL传递sessionid的方法:
只要在php文件的最前面加上如下几行即可
构建不依赖于cookie的手机端用户登录机制
手机端登录网站的问题是一个困扰我很久的问题。总是会有那么一些用户告诉我,他的手机不能登录网站了。要想能有效地解决手机登录的问题,一种方案就是尽可 能多地模拟出用户的手机端环境出来,针对这些具体的环境对代码进行测试和调整。另一种方案就是尽可能地让网站摆脱对于客户端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
sess
<_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" />输出来的结果如下:
<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中的&需要转化为&,否则浏览器解释的时候就会报错。因此,对于页面标签和重定向的情况,我们都需要针对wap1.x的页面做特殊处理。
重定向的情况很好处理,将第四部分的get_redirect_url函数中的$tag=’&’,在wap1.x的环境中替换为$tag=’&’即可。不过对于界面标签的处理,则需要我们引入一条新的配置项——arg_separator.output。这个配置项用来指定当在url中加入sessionId参数时,使用什么样的连字符,默认值是&。那么,在已知处于wap1.x环境时,加入如下的语句即可逢凶化吉了:
ini_set('arg_separator.output','&');好了,到此为止,我们已经基本上能解决掉wap开发中使用url传递sessionId的大部分情况了。看似内容比较多,实际上就介绍了html标
签中url如何传递sessionId和使用重定向时如何传递sessionId两种情况,并对wap1.x环境下的情况做了一些特殊处理,最终确保不依赖于cookie的用户登录机制得以实现的过程。希望这些总结的内容对于wap开发者能带来一定的帮助。
[转]手机端的cookie,session和URL重写  2009-12-24 17:38:01|  分类: 默认分类 |  标签: |字号大中小 订阅 .
本文的目的是搞清楚Session, Cookie, Url重写这些概念, 然后在这个基础上阐述如何利用
Url重写在Wap门户的开发中维护Session.
什么是Session, 什么是Cookie?
Session是由应用服务器维持的一个服务器端的存储空间,用户在连接服务器时,会由服务器生成一个唯一的SessionID,用该SessionID为标识符来存取服务器端的Session存储空间。而SessionID这一数据则是保存到客户端,用Cookie保存的,用户提交页面时,会将这一SessionID提交到服务器端,来存取Session数据。这一过程,是不用开发人员干预的。所以一旦客户端禁用Cookie,那么Session也会失效。
Cookie是客户端的存储空间,由浏览器来维持。
什么是Url重写?
服务器也可以通过URL重写的方式来传递SessionID的值,因此不是完全依赖Cookie。如果客户端Coo
kie禁用,则服务器可以自动通过重写URL的方式来保存Session的值,并且这个过程对程序员透明。
可以试一下,即使不写Cookie,在使用Cookies();取出的Cookie数组的长度也是1,而这个Cookie的名字就是JSESSIONID,还有一个很长的二进制的字符串,是SessionID的值。
实质上 URL 重写是通过向 URL 连接添加参数,并把 session ID 作为值包含在连接中。然而,为使这生效,你需要为你的 servlet 响应部分的每个连接添加 session ID.
知道了Session, Cookie, Url的概念,那么下面的这个问题就不难回答了:
Wap中如何进行Session管理?
Wap与PC不同之处在与Wap1.x不支持Session与Cookie,Wap2.0虽然支持但是只有协议支持还是不行,还要看手机终端支不支持?所以我们的解决方法就是完全不依赖Wap协议,完全不依赖手机终端,使用Url重写进行Session的维护,这个方法只与服务器端有关.
利用Url进行Session重写如何实现?
JSP实现
把 session ID 加到一个连接可以使用一对方法来简化:deURL() 使 URL
包含 session ID,如果你需要使用重定向,可以使用 deRedirectURL ()
来对 URL 进行编码。
encodeURL () 及 encodeRedirectedURL () 方法首先判断 cookies 是否被浏览器支持;
如果支持,则参数 URL 被原样返回,session ID 将通过 cookies 来维持。
代码示例:
不使用Url重写:
<a href=/servelet/
user;userName=awaysrain>Link</a>
使用Url重写:
通过HttpServletResponse接口中的encodeURL()方法编码.
String myURL = deURL(/servelet/user);
<a href= <%=myURL%> _fcksavedurl=" <%=myURL%>" _fcksavedurl=" <%=myURL%>" _fcksavedurl=" <%=myURL%>" >
JSTL实现
<c:url>可以为会话管理重写 URL
<a href="<c:url value='/content/sitemap.jsp'/>">View sitemap</a>
Struts实现:
struts配置文件中:
设置属性redirect, contextRelative
<forward name="listArticlesForBlog"
path="/template/listArticlesForBlog.jsp"
redirect="true"
contextRelative="true"/>
最后一个比较搞的问题:
那么在浏览器允许cookie的情况下,不要求浏览器关闭cookie的情况下使用
url重写如何实现?
/tomcat-5.5-doc/config/context.html
Context支持cookies参数。 设置cookies="false",强制只从url解析sessionid。
cookies
Set to true if you want cookies to be used for session identifierContext
communication if supported by the client (this is the default). Set to
false if you want to disable the use of cookies for session identifier
communication, and rely only on URL rewriting by the application.
通过sessionId的方式使手机浏览支持session(2)
高草酸尿症
收藏本页  2010年06月20日 01:43  /
  接上页
destroryed)或者重新登录一次(替换原有的sessionId)。
  Java代码
  public synchronized void sessionDestroyed(HttpSession session) {
  if(session != null) {
  Id());
  }
  }
  public synchronized void sessionDestroyed(HttpSession session) {
  if(session != null) {
  Id());
  }
  }
  单例模式的session容器已经构建,最后就是在类中提供一个getSession的方法;
  Java代码
  public synchronized HttpSession getSession(String sessionId) {
  if(sessionId == null)
  return null;
  return (HttpSession) (sessionId);
  }
  public synchronized HttpSession getSession(String sessionId) {
  if(sessionId == null)
  return null;
  return (HttpSession) (sessionId);
  }
  session容器的构建类已经写完,现在就是监听事件了,新建一个Listener,实现 HttpSessionListener,HttpSessionListener提供2个方式,一个是sesionCreated(session的创建方法),一个是sessionDistoryed(session的销毁方法),在created方法中,调用单例类中的sessionCreate方法,在destroyed方法中调用单例类中的sessionDistoryed方法,需要在l中进行配置.
  Java代码
  < listener>
  < listener-class>xxx包下的xxx类
  < /listener>
  < listener>
  < listener-class>xxx包下的xxx类
  < /li
stener>
  至此,就完成了一个session的构建,并且这个session是根据sessionId的变化而变化。下面看具体的代码:
  //session容器单例类
  Java代码
  import java.util.HashMap;
  import java.util.Map;
  import javax.servlet.http.HttpSession;
  public class SessionContext {
  private static SessionContext instance;
  private Map map;
  private SessionContext() {

本文发布于:2024-09-23 21:30:04,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/17019.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:手机   使用   支持
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议