Apache shiro和JSESSIONID

时间:2014-09-22 14:17:29

标签: java apache shiro

我正在测试apache shiro并且刚刚构建了位于https://github.com/pires/simple-shiro-web-app的简单演示

这只是shiro的一个简单用法,它尝试使用jdbcrealm进行身份验证。除了

之外,每件事情都可以
  • 成功后,Shiro不会更改SESSIONID 认证。这意味着SESSIONID在用户时是相同的 一旦用户通过身份验证,就会到达登录页面。

  • 还注意到,如果我关闭了成功通过验证 浏览器,下次打开并导航到页面时,我需要登录 再次。

这是shiro的常见行为吗?如果是,为什么?

2 个答案:

答案 0 :(得分:1)

如前所述,shiro在用户登录时不会生成新ID。您可以自己轻松地实现这一点:

@Override
protected boolean executeLogin( final ServletRequest request, final ServletResponse response )
        throws Exception
{
    final AuthenticationToken token = createToken( request, response );
    if ( token == null )
    {
        throw new IllegalStateException( "Your error message here" );
    }
    try
    {
        // Stop session fixation issues.
        // https://issues.apache.org/jira/browse/SHIRO-170
        final Subject subject = getSubject( request, response );
        Session session = subject.getSession();
        // Store the attributes so we can copy them to the new session after auth.
        final LinkedHashMap<Object, Object> attributes = new LinkedHashMap<Object, Object>();
        final Collection<Object> keys = session.getAttributeKeys();
        for ( Object key : keys )
        {
            final Object value = session.getAttribute( key );
            if ( value != null )
            {
                attributes.put( key, value );
            }
        }
        session.stop();
        subject.login( token );
        // Restore the attributes. 
        session = subject.getSession();
        for ( final Object key : attributes.keySet() )
        {
            session.setAttribute( key, attributes.get( key ) );
        }
        return onLoginSuccess( token, subject, request, response );
    }
    catch ( AuthenticationException e )
    {
        return onLoginFailure( token, e, request, response );
    }
}

Reference

答案 1 :(得分:0)

AFAIK shiro在登录时不会更改会话ID。我确实在我的项目中使用它,并没有看到它确实改变了会话ID。我认为这只是他们不支持的功能。当我切换到春天时,我遇到了各种各样的问题,因为spring确实支持这种行为。

关于你的第二点,我认为它与会话的持续时间有关。该会话可能配置为仅持续到浏览器关闭。如果Shiro使用url重写来维护会话,则必须请求另一次登录,因为url上的会话ID后缀将丢失。使用cookie可以支持这种行为,尽管这样做的典型方法是使用remember-me cookie。