【问题标题】:share session between classic ASP and PHP over than using database在经典 ASP 和 PHP 之间共享会话而不是使用数据库
【发布时间】:2013-09-05 08:31:24
【问题描述】:

我们有一个多年来开发的 ASP Intranet Web 应用程序,它在 IIS6 上运行。如今,我们想使用 PHP 语言添加一些新功能。 PHP 在同一台服务器上运行良好。会话变量需要在 ASP 和 PHP 之间共享。

我在问是否有其他替代方法可以在经典 ASP 和 PHP 之间共享会话,而不是使用数据库作为网关(对我们来说资源消耗过多)?双方都需要读取/编辑会话变量。

通过稍微调整,我注意到每次用户登录 ASP Web 应用程序时,PHP 端都会生成一个 PHPSESSID 和 ASPSESSIONID。这些在 ASP 端也是可见的,它们存储在服务器变量 HTTP_COOKIE 中,所以我认为 IIS 核心的 ASP 会话和 PHP 会话变量之间可能存在关联。

所以,

-- ASP--

<% Response.write ('HTTP_COOKIE') %> 

给予:

__utma=...; __utmz=...; computer%5Fid=AAA; lan=fre;ASPSESSIONIDXXXXXXXX=BBBBBBBBBBBBBBBBBBBBBBBB; user_login=cccc

-- PHP--

    echo '<pre>';
    var_dump($_COOKIE) ?>
    echo '</pre>';

给予:

Array
(
    [__utma] => ...
    [__utmz] => ...
    [computer_id] => AAA
    [lan] => fre
    [ASPSESSIONIDXXXXXXXX] => BBBBBBBBBBBBBBBBBBBBBBBB
    [user_login] => cccc
)

在 ASP 方面,如果我写的话:

<% Request.Cookies(strCookie)(strKey) %>

在一个循环中,它给了我一堆存储的键/值会话 cookie 列表。

但在 PHP 方面,我找不到获取这些键/值列表的方法。也许这是寻找更多的方法?一个真正的现有实现会有所帮助,但欢迎任何答案。

【问题讨论】:

  • 为什么要使用 2 种语言共享同一个会话?建议使用基于令牌的方法
  • 您可以实现自定义 PHP 会话处理程序。然后你需要弄清楚如何读取/解码/编码/写入 ASP 经典会话(从它们存储的任何地方)
  • 澄清一下,您希望 ASP 端写入 PHP 会话,反之亦然?我应该认为这是一个相当棘手的问题。正如@David 所说,在每一端实现自己的会话处理程序可能更容易,因此您了解格式。
  • 稍微google了一下,只修改PHP端看起来并不容易。这篇 MSDN 文章讨论了 ASP.Net 和 ASP 经典之间的共享会话:msdn.microsoft.com/en-us/library/aa479313.aspx 看起来您无法更改 ASP 经典会话的方式,只能在它之前和之后进入以将该会话数据复制到/从其他地方复制.如果您可以将建议的 COM 对象实例化添加到您的 ASP 经典应用程序中的一些常见包含中,那么该方法仍然可以工作。你想用什么来代替数据库?说一下redis之类的吧?
  • 我遇到了在经典 ASP 和 ASP.net 页面之间交换会话变量的问题。最简单的方法是使用零大小的 iframe 访问其他语言的页面,并在查询字符串中传递会话变量

标签: php session iis asp-classic


【解决方案1】:

我以前从未在 PHP 中使用过会话变量,所以在这里我假设您已经为 $var1 和 $var2 分配了要传递给 ASP 文件的会话变量的值。

<iframe height="0" width="0" scrolling="No" src="setsession.asp?var1=<?php echo $var1; ?>&var2=<?php echo $var2; ?>"></iframe>

那么你的 setsession.asp 文件就是

<%
Session("var1") = Request.Querystring("var1")
Session("var2") = Request.Querystring("var2")
%>

显然你可以反过来做,你只需要了解如何处理两种语言的查询字符串和会话变量

【讨论】:

    【解决方案2】:

    您可以通过从 PHP 脚本调用 session.asp 来完成此操作。

    PHP部分:

    $link = "$http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
    $url=explode("/",$link);
    array_pop($url);
    $urlp=implode("/",$url)."/";
    //here we get the url path
    
    $ck=array_keys($_COOKIE);
    for ($i=0;$i<count($ck);++$i) {
      if (strpos($ck[$i],"ASPSESSIONID")===0) {
        $cook .=$ck[$i]."=".$_COOKIE["$ck[$i]"].";"."<br>";
      }//we need to pass ASPSESSIONID cookies to ASP script
    }
    $opts = array(
      'http'=>array(
        'method'=>"GET",
        'header'=>"Cookie: ".$cook
      )
    );
    
    //function for reading/writing ASP session values
    function aspsession() {
      global $urlp,$opts;
      $n=urlencode(func_get_arg(0));
      if (func_num_args()==2) {
        $v=urlencode(func_get_arg(1));
        return file_get_contents("$urlp../session.asp?n=$n&v=$v",NULL,stream_context_create($opts));
      } else {
        return file_get_contents("$urlp../session.asp?w=$n",NULL,stream_context_create($opts));
      }//put the right relative URL for session.asp
      //make sure it's in the same application as your other ASP scripts,
      //so it has the same session
    }
    
    //to test if it works
    aspsession("a","test");
    echo aspsession("a");
    

    ...和 ​​session.asp

    <% @Language = "VBScript" 
         ENABLESESSIONSTATE = True%>
    <% Response.ContentType="text/plain" %>
    <% Response.Expires=-1 %>
    <%
    n=Request.QueryString("n")
    v=Request.QueryString("v")
    if n<>"" then
      session(n)=v
    else
      Response.Clear
      Response.Write session(Request.QueryString("w"))
    end if
    %>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-10
      • 2017-04-08
      • 1970-01-01
      • 2011-12-20
      • 2011-09-08
      相关资源
      最近更新 更多