我目前正在使用Spring和Shiro开发应用程序。我正在部署到Tomcat 7并在生产中使用nginx作为反向代理。除了在通过nginx代理访问应用程序时将jsessionid
添加到每个URL时,一切都很顺利(好一点)。
当我使用以下nginx配置时:
server {
server_name example.com www.example.com;
listen 80;
location /myapp {
proxy_pass http://localhost:8080;
}
}
我通过www.example.com/myapp访问该应用,一切都很好 - 网址中没有jsessionid
当我使用以下配置时:
server {
server_name sub.example.com www.sub.example.com
listen 80;
location / {
proxy_pass http://localhost:8080/myapp/;
}
我通过www.sub.example.com访问该应用,然后我看到jsessionid
添加到每个网址(即使在成功登录后)。
我找到了类似的线程,建议在web.xml中添加以下内容:
<session-config>
<tracking-mode>COOKIE</tracking-mode>
</session-config>
有效 - 好吧,jsessionid
已删除,但我无法进行身份验证,这让我觉得nginx中有cookie配置问题,有什么建议吗?
编辑//:找到解决方案,只需在nginx配置中添加以下内容:
proxy_cookie_path /myapp/ /;
答案 0 :(得分:2)
对于Shiro,我特意在我们的应用程序中使用以下内容解决了这个问题 - 您需要添加
private void S_GPSPosReceived(object sender, APIContainer<GPSPos> e)
{
//save MsgID to MessagesTable and get generated ID
//e.OriginalMessage.id
this.Dispatcher.Invoke(new Action(delegate()
{
tbLat.Text = e.Obj.Lat.ToString();
tbLon.Text = e.Obj.Lon.ToString();
tbTimeUsec.Text = e.Obj.TimeUsec.ToString();
tbFix.Text = e.Obj.FixType.ToString();
}));
}
在客户端上创建JSESSIONID cookie的请求中。基本上告诉shiro使用cookie源而不是urlrewriting来获取sessionids
以下不适用于Shiro的DefaultWebSessionManager。它只适用于ServletContainerSessionManager
request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_SOURCE, ShiroHttpServletRequest.COOKIE_SESSION_ID_SOURCE);
答案 1 :(得分:-1)
在proxy_pass之后添加以下内容可能有效:
proxy_redirect http://localhost:8080/myapp/ /;
proxy_pass和proxy_redirect经常相互补充。见http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_redirect