invalidate()方法简介
`invalidate()`
是`HttpSession`接口中定义一个方法
用于显式地销毁当前会话(Session)
调用该方法后
与该会话相关的所有数据都会被清除
浏览器下次访问时将创建一个新的会话
invalidate()方法功能
功能 | 描述 |
销毁当前会话 | 删除服务器端存储的 Session 数据 |
清除用户状态 | 如用户登录信息、购物车内容等 |
防止会话劫持 | 登出时应主动销毁会话,避免被他人复用 |
释放服务器资源 | 减少内存占用 |
invalidate()方法定义
void invalidate() throws IllegalStateException;
- 无参数,无返回值
- 抛出异常:
- 如果会话已经被销毁
再次调用会抛出`IllegalStateException`
例1:用户退出登录(Logout)
@WebServlet("/logout")
public class LogoutServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException {
// 获取当前会话(不强制创建)
HttpSession session = request.getSession(false);
if (session != null) {
// 销毁会话
session.invalidate();
}
// 跳转到登录页
response.sendRedirect("login");
}
}
注意事项:
当调用`session.invalidate()`
就不能再使用该`session`对象
否则会抛出异常
例2:在Filter中判断是否已登录
@WebFilter("/*")
public class AuthFilter implements Filter {
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
String uri = req.getRequestURI();
// 白名单路径无需登录即可访问
if (uri.endsWith("login") || uri.endsWith("login.jsp")) {
chain.doFilter(request, response);
return;
}
// 检查是否有有效会话和用户登录状态
HttpSession session = req.getSession(false);
if (session == null || session.getAttribute("user") == null) {
res.sendRedirect("login");
} else {
chain.doFilter(request, response);
}
}
}
invalidate()方法注意事项
用户登出时务必调用`invalidate()`
防止Session被复用,提升安全性
不要重复调用`invalidate()`
否则会抛出`IllegalStateException`
不要在`invalidate()`后继续操作Session对象
已失效的Session不能再读写属性
可结合监听器使用
如:
`HttpSessionlistener`记录用户登出行为
适合用于MVC架构
控制器中处理登出逻辑
视图中不再依赖Session数据
invalidate()方法使用场景
场景 | 使用方式 |
用户退出登录 | 调用 `session.invalidate()` 清除身份信息 |
强制用户下线 | 管理员操作时主动销毁某用户的 Session |
安全登出 | 结合Cookie 清理,实现完整登出流程 |
多设备登录控制 | 登录新设备时销毁旧设备Session |
Session注入防护 | 用户敏感操作前销毁旧Session 并生成新 |