[英]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分鍾的工作。 正如我剛剛做的概念驗證一樣,我可以為您提供食譜解決方案:
下載PHP-java-bridge文件。 我下載了JavaBridgeTemplate610.zip(用於所需的jar文件)和php-java-bridge_6.1.0_documentation.zip以獲取所需的示例,php包括文件和示例代碼(會話共享!)。
將“ JavaBridge.jar”,“ php-script.jar”和“ php-servlet.jar”添加到您的webapp中,方法是將其放入Java EE服務器的“ / WEB-INF / lib /”中。
將“ 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>
配置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>
將一個名為“ 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>
安裝所需的“ java.inc” php包含文件。 您可以在src.zip的下載的“ php-java-bridge_6.1.0_documentation.zip”中找到該文件。 復制“ / java”目錄中的“ java.inc”文件(僅此一個php文件!)。
重新啟動應用程序服務器
啟動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.