杰瑞科技汇

Java如何判断Session是否已过期?

Java 判断 Session 过期的几种方法

在 Java Web 应用中,判断 Session 是否过期是常见的需求,以下是几种常用的方法:

Java如何判断Session是否已过期?-图1
(图片来源网络,侵删)

使用 HttpSession 的 getMaxInactiveInterval() 和 getLastAccessedTime()

HttpSession session = request.getSession(false); // false表示不创建新session
if (session != null) {
    long lastAccessedTime = session.getLastAccessedTime();
    int maxInactiveInterval = session.getMaxInactiveInterval(); // 单位:秒
    long currentTime = System.currentTimeMillis();
    if ((currentTime - lastAccessedTime) / 1000 > maxInactiveInterval) {
        // Session已过期
        session.invalidate();
    } else {
        // Session未过期
    }
} else {
    // 本身就不存在session
}

使用 Servlet 3.0+ 的 isRequestedSessionIdValid()

if (!request.isRequestedSessionIdValid()) {
    // Session已过期或不存在
} else {
    // Session有效
}

使用 Session 监听器

// 在web.xml中配置监听器
<listener>
    <listener-class>com.example.SessionListener</listener-class>
</listener>
// 实现HttpSessionListener
public class SessionListener implements HttpSessionListener {
    @Override
    public void sessionCreated(HttpSessionEvent se) {
        // Session创建时执行
    }
    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        // Session销毁时执行(包括过期)
        System.out.println("Session已过期或被销毁: " + se.getSession().getId());
    }
}

在过滤器中检查

@WebFilter("/*")
public class SessionFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
            throws IOException, ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        HttpSession session = httpRequest.getSession(false);
        if (session == null || session.getAttribute("user") == null) {
            // 重定向到登录页面
            ((HttpServletResponse) response).sendRedirect(httpRequest.getContextPath() + "/login.jsp");
            return;
        }
        chain.doFilter(request, response);
    }
}

使用 Spring Security 的方法

如果使用 Spring Security,可以通过以下方式检查:

@Autowired
private SecurityContext securityContext;
// 检查用户是否已认证
if (securityContext.getAuthentication() != null && 
    securityContext.getAuthentication().isAuthenticated()) {
    // 用户已认证,Session有效
} else {
    // 用户未认证或Session已过期
}

注意事项

  1. getMaxInactiveInterval() 返回的是 Session 不活动的时间(秒),默认值通常为30分钟(1800秒)
  2. getLastAccessedTime() 返回的是最后一次访问 Session 的时间戳(毫秒)
  3. 如果使用 request.getSession(true),当 Session 不存在时会自动创建新 Session
  4. 在分布式系统中,可能需要考虑使用 Redis 等外部存储来管理 Session

方法可以根据具体应用场景和框架选择合适的实现方式。

Java如何判断Session是否已过期?-图2
(图片来源网络,侵删)
分享:
扫描分享到社交APP
上一篇
下一篇