Я столкнулся с проблемой сеанса на 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 /