≮六づ道≯的Blog

天行键,君子以自强不息! & 路漫漫其修远兮,吾将上下而求索!

黄殿瑶ID:feel8
185847次访问,排名349好友0人,关注者1
feel8的文章
原创 195 篇
翻译 0 篇
转载 1 篇
评论 100 篇
六道的公告
远离3721,还我一片静土!
 ╲█◤
◢██◣
   ◤◥
临渊羡鱼不如退而结网苦练内功ING -_-!!

昵称:≮六づ道≯
Mail:PHP5@QQ.COM
留言:点击留言




今日天气

最近评论
psnccs:WoW Gold
psnccs:WoW Gold
Eeeethan:不好意思,我想請教一個關於編譯Apache過濾器範例的問題,可能很初級,不過我確實找不到解答。我的問題是:
想請問怎麼要在Linux下用Gcc編譯:
httpd-2.2.4\modules\experimental\
裡的mod_case_filter.c
我下了
gcc -fPIC -I$../../include -c mod_case_……
风云★小子:一名刚学生!
你的时钟代码是什么啊?
南京甜蜜爱成人用品商城:<b>南京最大的零售、批发、加盟成人用品、性用品的网站[www.honey025.com],2000多种产品任您选购,1766个县市货到付款、3重

包装保密邮寄,主营:成人用品、性用品、性保健品、避孕用品、情趣内衣、壮阳药、阴茎增大丸、SM用品、安全套、男女自慰性器

具等</b><p>
[url=http://w……
文章分类
收藏
    相册
    我的相册
    My Links
    ChinaUNIX
    CSDN论坛
    Fedora官方网站
    LinuxEden
    LinuxSir
    mySQL官方网站
    PHP官方网站
    SmartTemplate
    中国赢网
    落伍者论坛
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 抛开cookie使用session-PHP中SESSION不能跨页传递问题的解决办法(转) 收藏

    新一篇: PHP编程:探索字串的奥秘 | 旧一篇: PHP编程:探索字串的奥秘

    在PHP中使用过SESSION的朋友可能会碰到这么一个问题,SESSION变量不能跨页传递。这令我苦恼了好些日子,最终通过查资料思考并解决了这个问题。我认为,出现这个问题的原因有以下几点:
    1、客户端禁用了cookie
    2、浏览器出现问题,暂时无法存取cookie
    3、php.ini中的session.use_trans_sid = 0或者编译时没有打开--enable-trans-sid选项

    为什么会这样呢?下面我解释一下:

    Session储存于服务器端(默认以文件方式存储session),根据客户端提供的session id来得到用户的文件,取得变量的值,session id可以使用客户端的Cookie或者Http1.1协议的Query_String(就是访问的URL的“?”后面的部分)来传送给服务器,然后服务器读取Session的目录……。也就是说,session id是取得存储在服务上的session变量的身份证。当代码session_start();运行的时候,就在服务器上产生了一个session文件,随之也产生了与之唯一对应的一个session id,定义session变量以一定形式存储在刚才产生的session文件中。通过session id,可以取出定义的变量。跨页后,为了使用session,你必须又执行session_start();将又会产生一个session文件,与之对应产生相应的session id,用这个session id是取不出前面提到的第一个session文件中的变量的,因为这个session id不是打开它的“钥匙”。如果在session_start();之前加代码session_id($session id);将不产生新的session文件,直接读取与这个id对应的session文件。

    PHP中的session在默认情况下是使用客户端的Cookie来保存session id的,所以当客户端的cookie出现问题的时候就会影响session了。必须注意的是:session不一定必须依赖cookie,这也是session相比cookie的高明之处。当客户端的Cookie被禁用或出现问题时,PHP会自动把session id附着在URL中,这样再通过session id就能跨页使用session变量了。但这种附着也是有一定条件的,即“php.ini中的session.use_trans_sid = 1或者编译时打开打开了--enable-trans-sid选项”。

    用过论坛的朋友都知道,在进入论坛的时候,往往会提示你检查Cookie是否打开,这是因为大多数论坛都是基于Cookie的,论坛用它来保存用户名、密码等用户信息,方便使用。而且很多朋友都认为Cookie不安全(其实不是这样),往往禁用它。其实在PHP程序中,我们完全可以用SESSION来代替Cookie,它可以不依赖于客户端是否开启Cookie。

    所以,我们可以抛开cookie使用session,即假定用户关闭cookie的情况下使用session,其实现途径有以下几种:

    1、设置php.ini中的session.use_trans_sid = 1或者编译时打开打开了--enable-trans-sid选项,让PHP自动跨页传递session id。
    2、手动通过URL传值、隐藏表单传递session id。
    3、用文件、数据库等形式保存session_id,在跨页过程中手动调用。

    途径1举例说明:

    s1.php

    <?php
    session_start();
    $_SESSION[’var1’]="中华人民共和国";
    $url="<a href=".""s2.php">下一页</a>";
    echo $url;
    ?>

    s2.php

    <?php
    session_start();
    echo "传递的session变量var1的值为:".$_SESSION[’var1’];
    ?>

    运行以上代码,在客户端cookie正常的情况下,应该可以在得到结果“中华人民共和国”。
    现在你手动关闭客户端的cookie,再运行,可能得不到结果了吧。如果得不到结果,再“设置php.ini中的session.use_trans_sid = 1或者编译时打开打开了--enable-trans-sid选项”,又得到结果“中华人民共和国”



    途径2举例说明:

    s1.php

    <?php
    session_start();
    $_SESSION[’var1’]="中华人民共和国";
    $sn = session_id();
    $url="<a href=".""s2.php?s=".$sn."">下一页</a>";
    echo $url;
    ?>

    s2.php

    <?php
    session_id($_GET[’s’]);
    session_start();
    echo "传递的session变量var1的值为:".$_SESSION[’var1’];
    ?>

    隐藏表单的方法基本原理同上。

    途径3举例说明:

    login.html

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
    <head>
    <title>Login</title>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
    </head>
    <body>
    请登录:
    <form name="login" method="post" action="mylogin1.php">
    用户名:<input type="text" name="name"><br>
    口 令:<input type="password" name="pass"><br>
    <input type="submit" value="登录">
    </form>
    </body>
    </html>

    mylogin1.php

    <?php

    $name=$_POST[’name’];
    $pass=$_POST[’pass’];
    if(!$name || !$pass) {
    echo "用户名或密码为空,请<a href="login.html">重新登录</a>";
    die();
    }
    if (!($name=="youngong" && $pass=="123") {
    echo "用户名或密码不正确,请<a href="login.html">重新登录</a>";
    die();
    }
    //注册用户
    ob_start();
    session_start();
    $_SESSION[’user’]= $name;
    $psid=session_id();
    $fp=fopen("e:\tmp\phpsid.txt","w+";
    fwrite($fp,$psid);
    fclose($fp);
    //身份验证成功,进行相关操作
    echo "已登录<br>";
    echo "<a href="mylogin2.php">下一页</a>";

    ?>

    mylogin2.php

    <?php
    $fp=fopen("e:\tmp\phpsid.txt","r";
    $sid=fread($fp,1024);
    fclose($fp);
    session_id($sid);
    session_start();
    if(isset($_SESSION[’user’]) && $_SESSION[’user’]="laogong" {

    echo "已登录!";
    }
    else {
    //成功登录进行相关操作
    echo "未登录,无权访问";
    echo "请<a href="login.html">登录</a>后浏览";
    die();
    }

    ?>

    同样请关闭cookie测试,用户名:youngong 密码:123 这是通过文件保存session id的,文件是:e: mpphpsid.txt,请根据自己的系统决定文件名或路径。

    至于用数据库的方法,我就不举例子了,与文件的方法类似。

    总结一下,上面的方法有一个共同点,就是在前一页取得session id,然后想办法传递到下一页,在下一页的session_start();代码之前加代码session_id(传过来的session id);

    发表于 @ 2004年10月29日 19:57:00|评论(loading...)|编辑

    评论

    #gguflvuduo 发表于2006-11-05 03:04:00  IP: 200.122.129.*
    TrackBack来自《atocynrlqu》

    gltlwpiry bfuvyvpeo hjvcovty ensyvupd
    #henry 发表于2005-01-28 20:57:00  IP: 218.80.1.*
    thank you for advice.
    It is very helpful!!!
    #Fatkin 发表于2005-02-23 13:51:00  IP: 218.188.8.*
    yes!!as the former reply..

    I work for 1 week for this stupid question.
    I tried a lot of things, but still fail until I saw this useful advice..

    THANK YOU VERY VERY MUCH!!
    #gy 发表于2005-03-20 16:20:00  IP: 218.89.181.*
    写的真是太好了
    #gy 发表于2005-03-20 16:22:00  IP: 218.89.181.*
    谁知道jsp中怎样实现同样的事情呢?
    #12800 发表于2005-06-01 12:44:00  IP: 61.186.252.*
    写的不错

    http://www2.25128.com/gsjj.asp.html
    #riverking23 发表于2005-06-17 16:03:00  IP: 61.186.252.*
    请问在不同的域名下怎么样共享session??
    望大虾指教
    #过客 发表于2005-06-21 10:54:00  IP: 61.186.252.*
    >session不一定必须依赖cookie,这也是session相比cookie的高明之处

    完全2回事吧, 这句话说的很不合适, 容易误导人.
    另外, 开了 session.use_trans_sid , 有非常大的安全隐患.
    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © 六道