有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Apache shiro和JSESSIONID

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

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

  • Shiro在成功完成会话后不会更改SESSIONID 认证。这意味着当用户 到达登录页面,并且在用户通过身份验证后到达

  • 还注意到,在成功验证后,如果我关闭
    浏览器,下次打开并导航到该页面时,我需要登录 又进来了

这是shiro的惯常行为吗。如果是,为什么


共 (2) 个答案

  1. # 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

  2. # 2 楼答案

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

    至于你的第二点,我认为这与会议的持续时间有关。该会话可能配置为仅持续到浏览器关闭。如果Shiro使用url重写来维护会话,它将不得不请求另一个登录,因为url上的会话id后缀将丢失。有了cookie,这种行为可以得到支持,尽管实现这一点的典型方法是使用“记住我”cookie