Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> nginx+tomcat session 
:(
    Опции темы
0x00
  Дата 30.9.2011, 08:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 192
Регистрация: 3.4.2006

Репутация: нет
Всего: нет




Возникла проблема.

Есть 2 сервера - на одном установлен nginx, на втором установлен tomcat.
nginx проксирует запросы на tomcat. кусок конфига nginx:

Код

        location / {        
            proxy_pass                    http://192.168.0.3:8001/;

            proxy_set_header            Host            $host;
            proxy_set_header            X-Real-IP        $remote_addr;
            proxy_set_header            X-Forwarded-For    $proxy_add_x_forwarded_for;

            client_max_body_size        10m;
            client_body_buffer_size     128k;

            proxy_connect_timeout       90;
            proxy_send_timeout          90;
            proxy_read_timeout          90;

            proxy_buffer_size           4k;
            proxy_buffers               4 32k;
            proxy_busy_buffers_size     64k;
            proxy_temp_file_write_size    64k;
        }


На tomcat крутится приложение, для доступа к которому требуется авторизация.
При загрузке страницы авторизации пользователя проверяется есть ли у него установленная сессия.

Код

            // проверим сессию в request
            SessionObject so = null;
            SessionUtil su = new SessionUtil(request.getSession());
            if(!su.isSessionObjectSetted()){
                so = new SessionObject();
                su.setSessionObject(so);
            }else{
                so = su.getSessionObject();
            }


код SessionUtil

Код

package session;

import session.objects.SessionObject;

import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpServletRequest;

public class SessionUtil {

    final String SESSION_OBJECT_DESCRIPTOR = "SessionObject";

    HttpSession sess;

    public SessionUtil(HttpSession session){
        this.sess = session;
        this.sess.setMaxInactiveInterval(60*60); // 1 hour
    }

    public SessionUtil(HttpServletRequest request){
        this.sess = request.getSession();
        this.sess.setMaxInactiveInterval(60*60); // 1 hour
    }
    
    public SessionUtil(){
        this.sess = null;
    }
    
    public void setHttpSession(HttpSession session){
        this.sess = session;
    }

    public HttpSession getHttpSession(){
        return this.sess;
    }

    public void setExpire(Integer secs){
        this.sess.setMaxInactiveInterval(secs);
    }

    public void setSessionObject(SessionObject sess_obj) throws SessionException{
        if(this.sess != null){
            this.sess.setAttribute(SESSION_OBJECT_DESCRIPTOR, sess_obj);
        }else{
            throw new SessionException("setSessionObject() error: this.sess is null!");
        }
    }

    public SessionObject getSessionObject() throws SessionException{
        if(this.sess != null){
            return (SessionObject)this.sess.getAttribute(SESSION_OBJECT_DESCRIPTOR);
        }else{
            throw new SessionException("getSessionObject() error: this.sess is null!");
        }
    }

    public boolean isSessionObjectSetted(){
        if(this.sess != null){
            if((SessionObject)this.sess.getAttribute(SESSION_OBJECT_DESCRIPTOR) != null){
                return true;
            }else{
                return false;
            }
        }else{
            return false;
        }
    }

    public void invalidateSession() throws SessionException{
        if(this.sess != null){
            this.sess.invalidate();
        }else{
            throw new SessionException("invalidateSession() error: this.sess is null!");
        }
    }

}



код SessionObject

Код

package session.objects;

import entities.Users;

import java.util.Date;

public class SessionObject {

    Users user;
    Date session_create;
    Date session_expire;

    public SessionObject(){
        Users usr = new Users();
        usr.setRole(-1); // not registred user
        this.user = usr;
        this.session_create = new Date(System.currentTimeMillis());
        this.session_expire = null;
    }

    public void setUser(Users u){
        this.user = u;
    }

    public Users getUser(){
        return this.user;
    }

    public Date getSessionCreateDate(){
        return this.session_create;
    }

}



Проблема в том, что у пользователя сессия всегда создается заново.
Это происходит только в том случае, если пользователь зашел через nginx-прокси.
Если пользователь заходит напрямую на tomcat (http://192.168.0.3:8001/), то все работает отлично.
Может кто сталкивался с подобной проблемой?

PM MAIL   Вверх
jk1
Дата 1.10.2011, 03:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1168
Регистрация: 17.10.2008
Где: Санкт-Петербург

Репутация: 5
Всего: 75



Если я правильно помню, то nginx при проксировании по умолчанию не форвардит cookie, а сессия опознается по ним.
Добавление вот этого в конфиг должно помочь
Код

proxy_pass_header Set-Cookie;
proxy_pass_header P3P;



--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
0x00
Дата 7.10.2011, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 192
Регистрация: 3.4.2006

Репутация: нет
Всего: нет



Цитата(jk1 @ 1.10.2011,  03:38)
Если я правильно помню, то nginx при проксировании по умолчанию не форвардит cookie, а сессия опознается по ним.
Добавление вот этого в конфиг должно помочь
Код

proxy_pass_header Set-Cookie;
proxy_pass_header P3P;

спасибо!)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0649 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.