Java Spring session 在请求之间不持久

标签 java spring session

我有这个 Controller

@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我创建一个 session 并添加属性 "testSession"进入其中:request.getSession().setAttribute("testSession", "Session test");

在页面/login有这个<form action="/login/check" method="post">

关于/login/check我尝试在/login上创建 session ,但它是空的。

为什么 session 在请求之间不持久?

P.S.:我的应用程序在远程服务器上运行,并使用 Tomcat 和 Apache 作为反向代理,我通过 https://mydom.com 访问我的应用程序

更新

我创建了一个 Controller 来测试 session :

@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 的每个请求它打印了另一个 id。

最佳答案

真正的问题出在 JSessionID 路径上。

JSessionID的路径为/myapp。这是 Tomcat 的结果,因为我的应用程序通常在 mydom.com:8080/myapp

下运行

但是使用 Apache 作为反向代理,我直接从 mydom.com/ 运行我的应用程序,这使得 JSessionID 无效,因为我不在 mydom 上。 com/myapp

所以我在 Apache 的虚拟主机(设置反向代理的位置)中添加了一个新行来更改 cookie 的路径:

ProxyPassReverseCookiePath /myapp /

这是我的最终VirtualHost,现在 session 在请求之间持续存在。

<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 /myapp /

</VirtualHost>

关于Java Spring session 在请求之间不持久,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56648205/

相关文章:

PHP 在 session 销毁或垃圾​​回收之前调用函数

php - Codeigniter 用户 session 错误

javascript - 无法在 Node.JS 中检索 session

java - 使用 hibernate 将表情符号保存到 mysql 不正确的字符串值 : '\xF0\x9F\x98\x88\xF0\x9F...' for column 'name' at row 1

java - 为什么我的 FTP 客户端无法连接到服务器?

java - Eclipse STS 4错误: Could not find or load main class

spring - 从 Spring Boot 2.1.9 升级到 2.2.1 (Spring Integration) 后的 ClassCastException

java:使用2个线程打印奇偶数

java - 如何使用java执行CMD命令?

java - Sprint TestRestTemplate 返回 Id null