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

使用 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已过期
}
注意事项
getMaxInactiveInterval()返回的是 Session 不活动的时间(秒),默认值通常为30分钟(1800秒)getLastAccessedTime()返回的是最后一次访问 Session 的时间戳(毫秒)- 如果使用
request.getSession(true),当 Session 不存在时会自动创建新 Session - 在分布式系统中,可能需要考虑使用 Redis 等外部存储来管理 Session
方法可以根据具体应用场景和框架选择合适的实现方式。

