用户
 找回密码
 入住 CI 中国社区
搜索
查看: 5792|回复: 11
收起左侧

[已解决] 请教url中附加session_id的问题

[复制链接]
发表于 2010-8-27 02:17:08 | 显示全部楼层 |阅读模式
为了解决不能自动支持session的浏览器,必须要把session_id附加到每个URL里面,以保证浏览器对Session的支持。

因为用户所有的请求都要附加这个session_id参数,并且session_id参数会与各个页面需要的参数一起出现。

应该把这个附加session_id的功能代码放在CI架构的什么位置呢?
发表于 2010-8-27 06:52:47 | 显示全部楼层
那要重写site_url() helper,将session_id放在固定segment,比如->uri->segment(3)
 楼主| 发表于 2010-8-27 10:02:15 | 显示全部楼层
我设置了php.ini里面session.use_trans_sid = 1。
在相同的站点内不用CI的MVC框架写了两个文件相互跳转的页面,分别使用
<a href="2.php">2.php</a>和<a href="1.php">1.php</a>
当设置浏览器拒绝使用session的时候。apache会自动在链接的后面附加上PHPSession=xxxxxx的串。

但是在这个站点的CI框架内却不会自动附加PHPSession。什么原因呢?
发表于 2010-8-27 10:08:29 | 显示全部楼层
我觉得不应该是 apache 自动添加的吧。。。
 楼主| 发表于 2010-8-27 10:23:13 | 显示全部楼层
本帖最后由 v5_6000 于 2010-8-27 10:29 编辑

我只是修改了php.ini的配置文件。
来访问的客户端是否支持session。
如果支持使用传统的HTTP HEAD方式来维持session机制。
如果不支持使用URL附加session字符串的方式来支持session机制。
这些事情程序里面都不需要进行编码。可以省去很多麻烦,而且通用性很强。

我还是希望能通过这个思路来解决问题。

可以使用opera浏览器,它可以设置“是否允许使用cookies”。测试起来挺方便的。
如果浏览器能cookie支持session。链接是这样的
  1. <a href="2.php">2.php</a>
复制代码
如果不支持链接是这样的
  1. <a href="2.php?PHPSESSID=ipk303540iono6atjq9q32lk27">2.php</a>
复制代码
这个转化过程是自动的。不需要调整代码。

PHP复制代码
1.php
<?php
session_start();
print_r($_SESSION);
if (isset($_SESSION["cou"])) {
          $a=$_SESSION["cou"];
    $_SESSION["cou"] = ++$a;
} else {
    $_SESSION["cou"]=3;
}
 
printf("strip_tags=%s session_id=%s isset=%s <br/>\n", strip_tags(SID), session_id(), isset($_SESSION["cou"]));
//phpinfo();
?>
 
<p>
<a href="2.php">2.php</a>
Done!
</p>
复制代码

PHP复制代码
2.php
<?php
session_start();
print_r($_SESSION);
if (isset($_SESSION["cou"])) {
          $a=$_SESSION["cou"];
    $_SESSION["cou"] = ++$a;
} else {
    $_SESSION["cou"]=3;
}
 
printf("strip_tags=%s session_id=%s isset=%s <br/>\n", strip_tags(SID), session_id(), isset($_SESSION["cou"]));
//phpinfo();
?>
 
<p>
<a href="1.php">1.php</a>
Done!
</p>
复制代码

  1. php.ini

  2. ; trans sid support is disabled by default.
  3. ; Use of trans sid may risk your users security.
  4. ; Use this option with caution.
  5. ; - User may send URL contains active session ID
  6. ;   to other person via. email/irc/etc.
  7. ; - URL that contains active session ID may be stored
  8. ;   in publically accessible computer.
  9. ; - User may access your site with the same session ID
  10. ;   always using URL stored in browser's history or bookmarks.
  11. session.use_trans_sid = 1
复制代码
发表于 2010-8-27 13:06:02 | 显示全部楼层
这种方法在ci里用不了,除非你放弃/index.php/ctrl/func/param这个格式,采用index.php?ctrl=xxx&func=xxx
 楼主| 发表于 2010-8-27 16:27:27 | 显示全部楼层
如果浏览器不支持cookies。有什么办法使用CI实现session机制。
如果使用PHP原生的session可以通过在url后面附加参数的方式实现。CI我应该如何做?
发表于 2010-8-27 16:29:26 | 显示全部楼层
答案在沙发,你改完后所有的网站链接都带session_id
发表于 2010-8-27 16:43:51 | 显示全部楼层
回复 7# v5_6000


    没有 Cookie 实现不了 Session 机制。
你可以手动为 CI 打开 GET 传参(参看论坛 FAQ 置顶帖)
然后在手动传递 session id,这个只要封装一下,你不用修改任何以前的代码。
 楼主| 发表于 2010-8-27 18:58:38 | 显示全部楼层
感谢两位的帮助。弄了一天终于解决了,来交个作业吧。
采用的是扩展CI原有的site_url()函数方法。

文件位置system/application/helpers/MY_url_helper.php
PHP复制代码
 
<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
 
if ( ! function_exists('site_url'))
{
        function site_url($uri = '')
        {
                $CI =& get_instance();
                $a = $CI->uri->uri_to_assoc(3);
                $sid=session_id();
                if(!isset($a["SID"])) {
                        if(!session_id()) {
                                session_start();
                                $sid=session_id();
                        }
                } else {
                        $sid = $a["SID"];
                        session_id($sid);
                        @session_start(); //todo有个重复启动的bug。不影响使用,以后再说了
                        if(!session_id()) {session_start();}
                }
               
                return $CI->config->site_url($uri."/SID/".$sid);
        }
}
 
复制代码
调用方法还是原来的site_url('path');
感觉这个解决方法还是比较透明的,影响很小。还算不错。

感觉这问题很偏门,搜了半天也没找到。可以单开一个分享贴了 :)

评分

参与人数 1威望 +5 收起 理由
Hex + 5 我很赞同

查看全部评分

本版积分规则