Java Spring Session не сохраняется между запросами - PullRequest
0 голосов
/ 18 июня 2019

У меня есть этот контроллер

@Controller
@RequestMapping(value = "/login")
public class Login{

    @RequestMapping
    public ModelAndView mainPage(HttpServletRequest request){

        request.getSession().setAttribute("testSession", "Session test");

        return new ModelAndView("/login");

    }

    @RequestMapping(value = "/check")
    public View check(HttpServletRequest request){

        System.out.println(request.getSession(false)); //null

        return new RedirectView("/login");

    }

}

При доступе /login я создаю сеанс и добавляю в него атрибут "testSession": request.getSession().setAttribute("testSession", "Session test");

На странице /login есть это <form action="/login/check" method="post">.

Вкл. /login/check Я пытаюсь создать сеанс в /login, но он пуст.

Почему сеанс не сохраняется между запросами?

P.S .: Мое приложение запускается на удаленном сервере с Tomcat и Apache в качестве реверсивного прокси, и я получаю доступ к своему приложению через https://mydom.com

UPDATE

Я создал контроллер для тестирования:

@Controller
@RequestMapping(value = "/sess")
public class TestSession{

    @RequestMapping(method = RequestMethod.GET)
    public void mainPage(HttpServletRequest request, HttpServletResponse response) throws IOException{

        //get or create session
        HttpSession session = request.getSession();

        response.setContentType("text/html");
        response.getWriter().println(session.getId());

    }

}

При каждом запросе к /sess печатается другой идентификатор.

Ответы [ 2 ]

5 голосов
/ 21 июня 2019

Настоящая проблема была в пути JSessionID.

Путь JSessionID был /myapp.Это было результатом Tomcat, потому что мое приложение обычно работает под mydom.com:8080/myapp

Но с Apache в качестве обратного прокси-сервера я запускаю свое приложение прямо из mydom.com/, что делает JSessionID недействительным, потому что я не наmydom.com/myapp.

Итак, я добавил новую строку в виртуальный хост от Apache (где установлен обратный прокси-сервер), чтобы изменить путь файлов cookie:

ProxyPassReverseCookiePath /myapp /

Это мой последний VirtualHost и теперь сеанс сохраняется между запросами.

<VirtualHost *:80>

    ServerName mydom.com

    ProxyRequests Off
    ProxyPreserveHost On
    ProxyPass / http://127.0.0.1:8080/myapp/
    ProxyPassReverse / http://127.0.0.1:8080/myapp/
    ProxyPassReverseCookiePath /emrahub-1.0.0 /

</VirtualHost>
0 голосов
/ 18 июня 2019

Используете ли вы пружинную безопасность? Может быть, вы можете установить http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.NEVER) если вы сами управляете сессиями

Ссылка: https://www.baeldung.com/spring-security-session

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...