簡體   English   中英

如何在php應用程序與Java EE應用程序之間共享會話?

[英]How to share session between php app and Java EE app?

我們可能用Java EE應用程序替換了一個PHP應用程序,但是問題是我們要一個接一個地替換模塊,這意味着兩個應用程序將共存並相互通信。

那么可以在兩個應用程序之間共享用戶會話嗎? 還是使用cookie來解決問題?

與PHP共享常規Java EE會話可以通過PHP-java-bridge高效而快速地完成。

與使用數據庫相比,此解決方案提供了卓越的性能,因為它不會生成任何磁盤IO。 它還不需要在PHP Web服務器或Java EE服務器上進行任何更改。 只需添加一些代碼,配置即可完成。

設置php-java-bridge可能會令人困惑,但是如果您知道該怎么做,那只是10分鍾的工作。 正如我剛剛做的概念驗證一樣,我可以為您提供食譜解決方案:

  1. 下載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中,方法是將其放入Java EE服務器的“ / WEB-INF / lib /”中。

  3. 將“ test.jsp”添加到您的Java EE服務器的“ / web”目錄中:

     <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”的文件添加到您的Web服務器根目錄,並確保您編輯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包含文件。 您可以在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

如果單擊指向jsp和php文件的鏈接,您會發現計數器在JSP和PHP腳本之間共享Java會話!

為了在JSP / Servlet和PHP中共享相同的JSession cookie,它們都需要在相同的域名上運行(還要確保JAVA_HOSTS是PHP文件使用相同的域名!)。

您可能要看的一個選項是Quercus ,它與Resin綁定在一起,可以讓您在Java EE應用服務器上運行PHP代碼,並可以在兩個平台之間進行一些通信。

使用session_set_save_handler()將會話數據保存到數據庫中。

UPDATE效率方面,它是非常微小的,從讀取文本文件到查詢數據庫(大概使用現有連接)是不同的。

一些示例代碼(從我的使用中簡化)

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;讀取/寫入會話$_SESSION['name'] = data; 在通常的技術中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM