v5_6000 发表于 2010-8-27 02:17:08

请教url中附加session_id的问题

为了解决不能自动支持session的浏览器,必须要把session_id附加到每个URL里面,以保证浏览器对Session的支持。

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

应该把这个附加session_id的功能代码放在CI架构的什么位置呢?

visvoy 发表于 2010-8-27 06:52:47

那要重写site_url() helper,将session_id放在固定segment,比如->uri->segment(3)

v5_6000 发表于 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。什么原因呢?

Hex 发表于 2010-8-27 10:08:29

我觉得不应该是 apache 自动添加的吧。。。

v5_6000 发表于 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。链接是这样的<a href="2.php">2.php</a>如果不支持链接是这样的<a href="2.php?PHPSESSID=ipk303540iono6atjq9q32lk27">2.php</a>这个转化过程是自动的。不需要调整代码。

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>

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>
php.ini

; trans sid support is disabled by default.
; Use of trans sid may risk your users security.
; Use this option with caution.
; - User may send URL contains active session ID
;   to other person via. email/irc/etc.
; - URL that contains active session ID may be stored
;   in publically accessible computer.
; - User may access your site with the same session ID
;   always using URL stored in browser's history or bookmarks.
session.use_trans_sid = 1

visvoy 发表于 2010-8-27 13:06:02

这种方法在ci里用不了,除非你放弃/index.php/ctrl/func/param这个格式,采用index.php?ctrl=xxx&func=xxx

v5_6000 发表于 2010-8-27 16:27:27

如果浏览器不支持cookies。有什么办法使用CI实现session机制。
如果使用PHP原生的session可以通过在url后面附加参数的方式实现。CI我应该如何做?

visvoy 发表于 2010-8-27 16:29:26

答案在沙发,你改完后所有的网站链接都带session_id

Hex 发表于 2010-8-27 16:43:51

回复 7# v5_6000


    没有 Cookie 实现不了 Session 机制。
你可以手动为 CI 打开 GET 传参(参看论坛 FAQ 置顶帖)
然后在手动传递 session id,这个只要封装一下,你不用修改任何以前的代码。

v5_6000 发表于 2010-8-27 18:58:38

感谢两位的帮助。弄了一天终于解决了,来交个作业吧。:victory:
采用的是扩展CI原有的site_url()函数方法。

文件位置system/application/helpers/MY_url_helper.php
<?phpif ( ! 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] 2
查看完整版本: 请教url中附加session_id的问题