HttpSession в Spring Boot всегда возвращает ноль - даже если SESSIONID cookie отправляется - PullRequest
0 голосов
/ 14 февраля 2019

Добрый вечер всем, я пытаюсь решить проблему с Spring Boot, которая меня бесит ...

Я делаю простое веб-приложение (подробности на данном этапе не важны)с Spring Boot и AngularJS 1.5.1

Я сделал аутентификацию с помощью API отдыха, это:

@PostMapping("/login")
@ResponseBody
public UserLoginResponse login(@RequestBody UserLogin userLogin, HttpServletResponse response, HttpServletRequest req) {

    UserLoginResponse resp;
    HttpSession currentSession = req.getSession(true);

    resp = new UserLoginResponse();

    logger.info(MessageFormat.format("CALLED - Login from user {0}",userLogin.getEmail()));

    resp.setId(userLogicManager.login(userLogin, currentSession));

    if(resp.getId() == -1) {
        response.setStatus(HttpStatus.NOT_FOUND.value());
        logger.info(MessageFormat.format("ERROR - Login failed user {0}",userLogin.getEmail()));
        currentSession.invalidate();
    }

    return resp;
}

Это вызывает его менеджер логики, здесь:

  public Long login(UserLogin userLogin, HttpSession session) {

    User user;
    Long res = new Long(-1), currTime;
    Date loginDate;

    logger.info(MessageFormat.format("LOGIC - Login user {0}", userLogin.getEmail()));

    loginDate = new Date();
    currTime = loginDate.getTime();

    user = userRepository.findUserByEmailAndPassword(userLogin.getEmail(), hashString(userLogin.getPassword()));

    if (user != null) {
        user.setLastLogin(new Timestamp(currTime));
        userRepository.save(user);
        res = user.getId();

        session.setAttribute("uid", user.getId());

        logger.info(MessageFormat.format("LOGIC - COMPLETED - Login user {0}", userLogin.getEmail()));
    }

    return res;
}

Я делаю запрос следующим образом:

    let loginUrl = mainConst.API_PROXY_URL;

    let apiUrl = mainConst.API_BASE_URL + "user/login";

    let requestParams = {
        method: "POST",
        url: loginUrl,
        data: credentials,
        headers : {
            'Target-URL': apiUrl,
            'Authorization': ""
        },
        withCredentials: true
    };

    $http(requestParams).then(success, fail);

Я прохожу через прокси-сервер nodejs для обработки CORS, который добавляетэто заголовки

res.header ("Access-Control-Allow-Origin", "http://localhost"); res.header (" Access-Control-Allow-Methods "," GET, PUT, PATCH,POST, DELETE "); res.header (" Access-Control-Allow-Headers ", req.header ('access-control-request-headers') +", Set-Cookie, Cookie ");

После этого звонка я правильно получаю этот заголовок с сервера:

set-cookie
SESSION = YjI5NzBjZjYtYmRiZC00Nz… jJiNzg4; Path = /; SameSite = Lax

ПРОБЛЕМА

Втчen я пытаюсь использовать этот сеанс, например, с этим API

@GetMapping("/restaurants")
@ResponseBody
public RestaurantResponse getRestaurants(HttpServletResponse response, HttpServletRequest req) {

    HttpSession currentSession = req.getSession(false);

    RestaurantResponse res = userLogicManager.getRestaurants(currentSession);

    if(res == null) {
        response.setStatus(HttpStatus.UNAUTHORIZED.value());
        logger.info("ERROR - Get restaurant failed - Not logged performer");
    }

    return res;
}

currentSession всегда равен нулю, даже если запрос к этому API имеет

Cookie
SESSION = YjI5NzBjZjYtYmRiZC00NzZmLTlkY2EtMDZjJiZxx1Z*

header.

Что я могу сделать, чтобы это исправить?Я пытаюсь сделать процесс аутентификации с помощью HttpSession, но это блокирует мой проект, я неделю пытаюсь его решить

...