Потеря идентификатора сеанса при каждом запросе в Spring 3 MVC-приложении с прокси-сервером Apache - PullRequest
2 голосов
/ 08 марта 2011

У меня есть веб-приложение, для которого я настраиваю корзину для покупок;Приложение обслуживает множество разных сайтов, каждый со своим доменом.Виртуальные хосты используются для перенаправления каждого домена на сервер Tomcat 6, а также для задания пути к статическим ресурсам этого конкретного сайта;эти статические ресурсы не могут быть сохранены в веб-приложении, поэтому они хранятся на сервере и обслуживаются через Apache.

сначала я использую JkMount в корне контекста, затем перезаписываю URL с помощью [P, L] для полученияконтекстный путь «mywebapp» вне URL, поэтому, когда кто-то переходит к этому приложению с доменом somedomain.com, веб-приложение обрабатывает на somedomain.com/mywebapp/store/cart, но браузер видит somedomain.com/store/cart.До сих пор это работало очень хорошо;Проблема в том, что у каждого запроса сбрасывается сеанс, и я не знаю почему.

Если я удаляю apache из внешнего интерфейса обслуживания сеанса, он не сбрасывается и работает нормально (как я и ожидал).Но я не могу настроить свой виртуальный хост для перенаправления в приложение без потери сеансов.Я много читал об этой проблеме, но моя компетенция в JavaEE, и я очень мало знаю об Apache Web Server;поэтому я даже не знаю, с чего начать исследование исправления.

Я слышал о чем-то, называемом ProxyPassing, но я не уверен, что это значит или как оно работает;В большинстве примеров, которые я видел, есть изменения в Tomcat server.xml при добавлении домена, чего я не могу сделать, потому что домены (виртуальные хосты для сопоставления) добавляются динамически, и я могу перезапустить Apache, но не могу перезапустить JavaEEприложение каждый раз, когда добавляется новый сайт.

Есть какие-нибудь идеи по устранению этой проблемы или поиску первопричины?Какие-нибудь альтернативные подходы?

UDPATE : я собираюсь опубликовать запись своего виртуального хоста для одного из динамических веб-сайтов

    <VirtualHost *:80>
    ServerAdmin test@test.com
    DocumentRoot "C:/wamp/www"
    ServerName jawesome.com
    ServerAlias www.jawesome.com
    ErrorLog "logs/jawesome_com-error.log"
    CustomLog "logs/jawesome_com-access.log" common

    Alias /files/ "C:/static/1/uploaded_files/"
    <Directory "C:/static/1/uploaded_files">
                Options FollowSymLinks Indexes MultiViews
                Order allow,deny
                Allow from all
    </Directory>

    JkMount /webapp ajp13
    JkMount /webapp/* ajp13

    RewriteEngine on
    #RewriteLogLevel 9
    #RewriteLog "/usr/local/apache/logs/testrewrite.log"

    RewriteCond %{REQUEST_URI} !^/(webapp/.*|files/.*)$
    RewriteRule ^/(.*)$ /webapp/$1 [P,L]
</VirtualHost>

Ответы [ 2 ]

2 голосов
/ 08 марта 2011

Path необходимо удалить из файла cookie JSESSIONID.Одним из вариантов будет удалить его в настройках Tomcat.Добавьте emptySessionPath="true" к вашему AJP-коннектору.

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" emptySessionPath="true"/>

Единственная ошибка, если у вас есть другие приложения, работающие в этом же домене, они будут использовать этот идентификатор сессии.Но я не вижу ничего в вашей конфигурации.

0 голосов
/ 08 марта 2011

Я работаю в команде, которая управляет несколькими веб-приложениями java, каждый из которых имеет свои собственные механизмы аутентификации.У нас есть несколько серверов Apache с балансировкой нагрузки, и мы используем ProxyPass для направления трафика на серверные веб-приложения.Пока ProxyPass работает хорошо.

Вот пример, который будет перенаправлять входящие запросы к и от mywebapp, работающие на сервере Tomcat.

<VirtualHost *:80>
ServerName somedomain.com
    ProxyRequests Off
<Proxy *>
    Order deny,allow
        Allow from all
</Proxy>

ProxyPass /mywebapp http://tomcat-server:8080/mywebapp
ProxyPassReverse /mywebapp http://tomcat-server:8080/mywebapp
<Location />
    Order allow,deny
    Allow from all
</Location>
...
# can put rewrite rules here
...
</VirtualHost>

Мы также используем правила перезаписи, и они отлично работают с такими определениями прокси-серверов, как этот.

Надеюсь, это поможет, удачи.

...