Как обмениваться сеансом между приложением php и Java EE?

Мы можем заменить приложение PHP приложением Java EE, но проблема в том, что мы хотим заменить модули один за другим, что означает, что два приложения будут сосуществовать и взаимодействовать друг с другом.

Так можно ли делиться сеансом пользователя между двумя приложениями? Или использовать файл cookie для решения проблемы?

Сохраните данные сеанса в базе данных с помощью 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; в обычной технике.

Совместное использование обычного Java EE-сессии с PHP может быть очень эффективным и быстрым с помощью PHP-java-bridge .

Это решение обеспечивает превосходную производительность по сравнению с использованием базы данных, поскольку она не генерирует диск IO. Он также не нуждается в каких-либо изменениях на веб-сервере PHP или сервере 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, поместив его в «/ WEB-INF / lib /» из вас – сервер Java EE.

  3. Добавьте «test.jsp» в каталог «/ web» серверов Java EE:

     <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, чтобы он мог использоваться 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» к своему корневому веб-серверу и убедитесь, что вы редактируете JAVA_HOSTS и JAVA_SERVLET, чтобы правильно указать Javabridgeservlet, как это указано в web.xml.

     <?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. Вы найдете файл в загруженном «php-java-bridge_6.1.0_documentation.zip» в src.zip. Скопируйте файл «java.inc» в каталог «/ java» (только этот файл php!).

  7. Перезапустить сервер приложений

  8. Запустите скрипт test.php (например, goto: http://127.0.0.1/test.php )

Если вы нажмете ссылки на файл jsp и php, вы заметите, что счетчик разделяет сеанс Java между скриптами JSP и PHP!

Чтобы разделить один и тот же JSession-файл cookie в JSP / Servlet и PHP, оба они должны запускаться на одном доменном имени (также убедитесь, что JAVA_HOSTS – это файл PHP, использует то же имя домена!).

Одним из вариантов, на который вы можете обратить внимание, является Quercus, который привязан к Resin, и позволяет вам запускать PHP-код на сервере приложений Java EE и обеспечивает некоторую связь между двумя платформами.