我有这个 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/