Shiro,Spring应用程序将jsessionid附加到每个URL

时间:2014-10-22 13:23:45

标签: spring nginx proxy shiro jsessionid

我目前正在使用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/ /;

2 个答案:

答案 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