关于 servlet 的session销毁的问题
我有个session,当我关闭浏览器的时候,用监听器为什么没有监听到session的销毁,但是当我在程序中明确销毁session的时候,却可以监听到session的销毁?...
我有个session,当我关闭浏览器的时候,用监听器为什么没有监听到session的销毁,但是当我在程序中明确销毁session的时候,却可以监听到session的销毁?
监听器public class OnlineUserListener implements HttpSessionListener {
public void sessionCreated(HttpSessionEvent event) {
}
public void sessionDestroyed(HttpSessionEvent event) {
HttpSession session = event.getSession();
ServletContext application = session.getServletContext();
// 取得登录的用户名
String username = (String) session.getAttribute("username");
// 从在线列表中删除用户名
List onlineUserList = (List) application.getAttribute("onlineUserList");
onlineUserList.remove(username);
System.out.println(username + "退出。");
}
代码销毁的session可以监听到:
public class LogoutServlet extends HttpServlet {
public void doGet(HttpServletRequest request,HttpServletResponse response)
throws ServletException, IOException {
// 销毁session
request.getSession().invalidate();
// 成功
response.sendRedirect("index.jsp");
}
} 展开
监听器public class OnlineUserListener implements HttpSessionListener {
public void sessionCreated(HttpSessionEvent event) {
}
public void sessionDestroyed(HttpSessionEvent event) {
HttpSession session = event.getSession();
ServletContext application = session.getServletContext();
// 取得登录的用户名
String username = (String) session.getAttribute("username");
// 从在线列表中删除用户名
List onlineUserList = (List) application.getAttribute("onlineUserList");
onlineUserList.remove(username);
System.out.println(username + "退出。");
}
代码销毁的session可以监听到:
public class LogoutServlet extends HttpServlet {
public void doGet(HttpServletRequest request,HttpServletResponse response)
throws ServletException, IOException {
// 销毁session
request.getSession().invalidate();
// 成功
response.sendRedirect("index.jsp");
}
} 展开
3个回答
展开全部
session与浏览器关不关是没关系的。HttpSession API 是构建在cookie或URL重写上面的。session的信息存储并不是一关闭浏览器就失效了,你可以显式的销毁地,也可以由服务器超过时间销毁。服务器具有默认时间,你也可以重新设定他的session失效时间,在servlet里setMaxInactiveInterval方法设定;或在web-xml里面透过设定
<session-config>
<session-timeout>(分钟数)</session-timeout>
</session-config>
当然你也可以设0或负数(不会失效)。
<session-config>
<session-timeout>(分钟数)</session-timeout>
</session-config>
当然你也可以设0或负数(不会失效)。
追问
那关闭浏览器session不是摧毁了吗?怎么会监听不到呢?
追答
会话跟踪(session-tracking)基于存储在浏览器内存中(非磁盘)的cookie。因此退出浏览器会造成会话中断:客户程序将不能再访问会话。但问题是服务器不知浏览器已经关闭,因此服务器需要将会话维护在内存中,直到它处于非活动时间超过最大时间间隔。
展开全部
其实上面说的很好:session与浏览器关不关是没关系的。session是保存在服务器端的,只是会把sessionId通过会话cookie或重写url的方式发送给浏览器。浏览器关闭了,只是浏览器丢失了sessionId而已。在服务器端,session还在,因为http协议是无状态的,浏览器不会把自己关闭的事件通知服务器,那服务器只有等session超时后才会销毁session,并通知监听者。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
因为session是寸在服务端的~距上一次回话结束后30分钟(默认)没有新会话。Session会自动销毁!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询