如何知道与主题关联的会话在java shiro中是否已过期

我正在实现安全的
java shiro.i需要在会话过期时返回消息,如果会话未过期,那么我需要返回不同的消息,如un Authenticate user.

这是我的代码.

@GET
@Path("/{userId}")
public Response view(@PathParam("userId")String userId)
{
   ResponseBuilder builder = Response.ok();
   if(SecurityUtils.getSubject().isAuthenticated())
    {

       Registeration registeration=new Registeration();
       boolean status=registeration.getDetails(userId,builder);
       log.debug("the status is:"+status); 


    }
    else
    {
        builder.status(401).entity("You are currently not login .please Login for Access Services");

    }   
    return builder.build();     

}

以上休息服务工作正常.当用户没有登录时.此方法将返回else部分的消息.但我还需要返回消息,在会话过期后,用户尝试访问此休息服务,然后我需要返回“您的会话已过期”.
但是在上面的情况下,如果会话过期,那么同样的消息和if用户也没有登录,那么同样的消息.
我不知道我将如何检查这两个条件
1)如果用户没有登录,则message =“您正在登录”
2)如果会话已经过期,那么messsage =“你的会话已经过期”

最佳答案 在执行了一些简单的测试之后,我相信使用SecurityUtils.getSubject().isAuthenticated()的方式在当前会话超时时无法获得正确的结果.我想这对你有用,因为第二个请求为你创建了另一个主题而不是原始主题.通过ThreadContext.getSubject()而不是SecurityUtils.getSubject()获取它可以很容易地证明这一点,因为如果它为null,后者会为你创建一个新的Subject.如果第二次请求到达您的方法并且ThreadContext.getSubject()的返回值为null,则表示它是与Shiro的新线程的新连接.

所以,我的测试结果表明,如果它是’超时’的情况,Subject.isAuthenticated()仍将返回true.请注意他们的文件Session Validation & Scheduling

For performance reasons, Sessions are only validated to see if they have been stopped or expired at the time they are accessed (i.e. subject.getSession()). This means that without additional regular periodic validation, Session orphans would begin to fill up the session data store.

根据您的要求,您可以实现SessionListener并在方法onExpiration中记录主体.或者您可以访问会话以在Shiro中触发验证:

if(SecurityUtils.getSubject().isAuthenticated()) {
    Session session = SecurityUtils.getSubject().getSession(false);
    try {
        session.touch();
    } catch (ExpiredSessionException e) {
        // timeout case.
    }
} else {
    // not login case.
}

调用session.touch()并不是多余的,因为它会更新lastAccessTime,如果您从未在代码中触摸会话,则不会这样做.

点赞