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