Назад | Перейти на главную страницу

Проблема сеанса на URL-адресе балансировки нагрузки Apache Web Server + Tomcat 7.0.54

Я столкнулся с проблемой сеанса на URL-адресе балансировки нагрузки, сеанс не создается, но он отлично работает, когда я напрямую использую URL-адрес Tomcat.

Контроллер:

@RequestMapping(value = "/authenticateUser", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<Users> login(@RequestBody LoginParams params, UriComponentsBuilder ucBuilder)  {
    Users user = null;
    try {
        /* Check if user is already logged in*/
        boolean isUserAlreadyLoggedin = false;
        HttpSession httpSession = SessionHandler.getSession();
        if (httpSession.getAttribute("session_user") != null) {
            isUserAlreadyLoggedin = true;
            user = (Users) httpSession.getAttribute("session_user");
        }
        if (!isUserAlreadyLoggedin) {
            // after login related code...
            httpSession.setAttribute("session_user", user);
        }
        return new ResponseEntity<Users>(user, HttpStatus.OK);
    } catch (Exception e) {
        logger.error("Error while authenticating:" + e.getMessage());
    }
 }
}  

Вспомогательный класс My Session Handler:

class SessionHandler{
     public static HttpSession getSession() {
        ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();

        HttpSession session = attr.getRequest().getSession(false);
        if (session == null) {
            // Not created yet. Now do so yourself.
            session = attr.getRequest().getSession(true);
        } 
        return session;
    }


 public static boolean isSessionAlive()
 {
      boolean isSessionAlive = false;
        try {

            HttpSession httpSession = SessionHandler.getSession();
            if (httpSession.getAttribute("session_user") != null) {
                isSessionAlive = true;
            }
        }catch(Exception e){
            logger.error("Error in Session handler",e);
        }
        return isSessionAlive;
  }
 }

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

    @RequestMapping(value = "/checkWhetherSessionIsAlive", method = RequestMethod.GET, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<Boolean> checkWhetherSessionIsAlive(UriComponentsBuilder ucBuilder) {

    boolean isSessionAlive = false;
    try {

        HttpSession httpSession = SessionHandler.getSession();
        if (httpSession.getAttribute("session_user") == null) {
            isSessionAlive = false;
        } else {
            isSessionAlive = true;
        }
    } catch (Exception e) {

    }

    return new ResponseEntity<Boolean>(isSessionAlive, HttpStatus.OK);
}

Как только пользователь входит в систему, создается сеанс, он перенаправляется на домашнюю страницу, и сразу же срок действия сеанса истекает, и он перенаправляется на страницу входа.
Итак, чтобы подвести итог, сеанс не создается по этому URL-адресу: www.application.com/app (балансировка нагрузки f5 -> веб-сервер APache -> tomcat)

он отлично работает с URL: tomcat: 8080 / AOS /