如何在php应用程序和Java EE应用程序之间共享会话?

时间:2010-04-11 02:00:49

标签: php java-ee

我们可能会用Java EE应用程序替换PHP应用程序,但问题是我们要逐个替换模块,这意味着两个应用程序将共存并相互通信。

那么可以在两个应用之间共享用户会话吗?或者使用cookie来解决问题?

3 个答案:

答案 0 :(得分:4)

使用PHP-java-bridge可以非常高效,快速地与PHP共享常规Java EE会话。

此解决方案提供优于使用数据库的性能,因为它不会生成任何磁盘IO。它也不需要对PHP Web服务器或Java EE服务器进行任何更改。只需添加一些代码,配置就可以了。

设置php-java-bridge可能令人困惑,但如果你知道怎么做,那只是一个10分钟的工作。正如我刚才做了一个概念验证,我可以向你提供食谱解决方案:

  1. Download PHP-java-bridge个文件。我下载了JavaBridgeTemplate610.zip(用于所需的jar文件)和php-java-bridge_6.1.0_documentation.zip以获取所需的示例,php包含文件和示例代码(会话共享!)。

  2. 将“JavaBridge.jar”,“php-script.jar”和“php-servlet.jar”添加到webapp中,方法是将它放在你的“/ WEB-INF / lib /”中是Java EE服务器。

  3. 在您的Java EE服务器“/ web”目录中添加“test.jsp”:

    <HTML>
    <TITLE>PHP and JSP session sharing</title>
    <BODY>
    <%
    
    javax.servlet.http.HttpSession $session = request.getSession();
    if($session.getAttribute("counter")==null) {
      $session.setAttribute("counter", new java.lang.Integer(1));
    }
    
    int $counter = ((java.lang.Integer)$session.getAttribute("counter")).intValue();
    out.println ("HttpSession variable \"counter\": " + $counter + "<br>");
    java.lang.Integer $next = new java.lang.Integer($counter+1);
    session.setAttribute("counter", $next);
    %>
    <a href="http://127.0.0.1/test.php">PHP page</a>
    </BODY>
    </HTML>
    
  4. 配置JavaBridge servlet,以便PHP可以使用它与Java EE服务器进行通信。只需将以下行添加到web.xml:

    <servlet>
      <servlet-name>PhpJavaServlet</servlet-name>
      <servlet-class>php.java.servlet.PhpJavaServlet</servlet-class>
    </servlet>
    <servlet-mapping>
      <servlet-name>PhpJavaServlet</servlet-name>
      <url-pattern>*.phpjavabridge</url-pattern>
    </servlet-mapping>
    
  5. 将一个名为“test.php”的文件添加到您的webserver根目录中,并确保编辑JAVA_HOSTS和JAVA_SERVLET以正确指向web.xml中配置的Javabridgeservlet。

    <?php
    define ("JAVA_HOSTS", "127.0.0.1:8084");
    define ("JAVA_SERVLET", "/JavaBridge.phpjavabridge");
    
    require_once("java/Java.inc");
    $session = java_session();
    ?>
    
    <HTML>
    <TITLE>PHP and JSP session sharing</title>
    <BODY>
    <?php
    if(is_null(java_values($session->get("counter")))) {
      $session->put("counter", 1);
    }
    $counter = java_values($session->get("counter"));
    print "HttpSession variable \"counter\": $counter<br>\n";
    $session->put("counter", $counter+1);
    ?>
    <a href="http://127.0.0.1:8084/test.jsp">JSP page</a>
    </BODY>
    </HTML>
    
  6. 安装所需的“java.inc”php include文件。您可以在src.zip中下载的“php-java-bridge_6.1.0_documentation.zip”中找到该文件。复制“/ java”目录中的“java.inc”文件(只需这个php文件!)。

  7. 重新启动应用程序服务器

  8. 启动test.php脚本(例如goto:http://127.0.0.1/test.php

  9. 如果单击指向jsp和php文件的链接,您会注意到计数器共享JSP和PHP脚本之间的Java会话!

    为了在JSP / Servlet和PHP中共享相同的JSession cookie,它们都需要在相同的域名上运行(同时确保JAVA_HOSTS是PHP文件使用相同的域名!)。 /强>

答案 1 :(得分:2)

您可能希望查看的一个选项是Quercus,它与Resin绑定,允许您在Java EE应用服务器上运行PHP代码,并在两个平台之间进行一些通信。

答案 2 :(得分:1)

使用session_set_save_handler()将会话数据保存到数据库。

<强>更新 效率方面,它是非常小的,与读取文本文件到查询数据库(可能使用现有连接)的区别。

一些示例代码(从我使用的内容中简化)

class Session {
    public function __construct() {
        session_start();       
        $this->clean();        
    }
    public function __destruct() {
        session_write_close();
    }
    public function open() {
        return TRUE;
    }    
    public function close() {
        return TRUE;
    }    
    public function read($id) {
        global $Database;
        if ($Database->select('session_data FROM sessions WHERE session_id="%s"', $id)) {
            list($data) = $Database->fetch(MYSQL_NUM);
            return $data;
        } else {
            return '';
        }
    }    
    public function write($id, $data) {
        global $Database;
        return $Database->replace('sessions SET session_id="%s", session_data="%s", session_updated=%d', array($id, $data, time()));
    }    
    public function destroy($id) {
        global $Database;
        $_SESSION = array();
        return $db->delete('sessions WHERE session_id="%s"', $id);
    }    
    public function clean($expire = 600) {
        global $Database;
        $Database->delete('FROM sessions WHERE session_updated<%d', $time - $expire);
        return TRUE;
    }
}
// Declare the functions to use:
session_set_save_handler(array('Session', 'open'), array('Session', 'close'), array('Session', 'read'), array('Session', 'write'), array('Session', 'destroy'), array('Session', 'clean'));
$Session = new Session;

您可以使用常规技术中的$_SESSION['name'] = data;来读取/写入会话数据。