Как разделить сеанс между приложением php и приложением Java EE? - PullRequest
1 голос
/ 11 апреля 2010

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

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

Ответы [ 3 ]

4 голосов
/ 11 апреля 2010

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

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

  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 таким образом, чтобы он мог использоваться 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. Вы найдете файл в загруженном файле «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!

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

2 голосов
/ 11 апреля 2010

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

1 голос
/ 11 апреля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...