Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > nginx+tomcat session


Автор: 0x00 30.9.2011, 08:11

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

Есть 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/), то все работает отлично.
Может кто сталкивался с подобной проблемой?

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

proxy_pass_header Set-Cookie;
proxy_pass_header P3P;

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

proxy_pass_header Set-Cookie;
proxy_pass_header P3P;

спасибо!)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)