2014-10-22 4 views
1

В настоящее время я разрабатываю приложение с Spring и Shiro. Я развертываю Tomcat 7, и в производстве я использую nginx в качестве обратного прокси. Все работает плавно (хорошо), за исключением того, что jsessionid добавляется к каждому URL при доступе к приложению через прокси nginx.Shiro, Spring приложение, добавляющее jsessionid для каждого URL

Когда я использую следующие Nginx конфигурации:

server { 
     server_name example.com www.example.com; 
     listen 80; 

     location /myapp { 
       proxy_pass http://localhost:8080; 
     } 
} 

я получить доступ к приложению через www.example.com/myapp, все нормально, то - в URL

jsessionid нет Когда я использую следующие конфигурации :

server { 
     server_name sub.example.com www.sub.example.com 
     listen 80; 
     location/{ 

       proxy_pass http://localhost:8080/myapp/; 
} 

я получить доступ к приложению через www.sub.example.com, а затем я вижу jsessionid добавляется к каждому URL (даже после успешного входа в систему).

я нашел подобную нить, которая посоветовала добавить следующее в web.xml:

<session-config> 
    <tracking-mode>COOKIE</tracking-mode> 
</session-config> 

Это работает - хорошо, jsessionid удаляется, но я не могу аутентифицировать, что заставляет меня думать, что есть конфигурация печенья проблема в nginx, любые советы?

EDIT //: Найдено решение, просто нужно добавить следующее в Nginx конфигурации:

proxy_cookie_path /myapp/ /; 
+0

Вы подтвердили, что это проблема с печеньем? Вы можете аутентифицироваться при доступе к tomcat непосредственно на производстве? Также проверьте значение cookie в веб-браузере (используя консоль хром или что-то еще), устанавливается ли это значение и не меняется ли значение? – Wouter

+0

Я могу проверить подлинность без проблем при непосредственном доступе к tomcat. Даже доступ к первой конфигурации nginx работает. – Stugal

ответ

1

Для Shiro конкретно я исправила эту проблему в нашем приложении со следующим - Вам нужно добавить

request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_SOURCE, ShiroHttpServletRequest.COOKIE_SESSION_ID_SOURCE); 

в запросе, который создает куки JSESSIONID на клиенте. В основном говоря, чтобы использовать источник cookie вместо urlrewriting для получения сессий

Следующие действия не выполняются с помощью DefaultWebSessionManager от Shiro. Он работает только с ServletContainerSessionManager

<session-config> 
    <tracking-mode>COOKIE</tracking-mode> 
</session-config> 
+1

это должно быть отмечено как ответ. Это было абсолютно правильно! – lrn2prgrm