session的创建时机:
session的创建并不是在浏览器向服务器发出请求的瞬间产生的,而是在server端调用HttpServletRequest.getSession()时创建的。
在一个jsp页面中,session能够作为隐式对象被调用是因为jsp在编译的过程中自动调用了HttpServletRequest.getSession()。
而当在jsp商品页面中使用<%@ page session="false"%>时,jsp页面将不会去主动创建session,但是我们仍然可以在jsp页面中主动调用HttpServletRequest.getSession()去生成一个session。
关于HttpServletRequest.getSession():
HttpServletRequest.getSession(true)表示获取session,如果没有session,那么HttpServletRequest.getSession()就会自动创建一个session。
HttpServletRequest.getSession(false)表示也表示获取session,但是如果没有session,会返回null。
关于session失效:
session失效有两种方法,一种是设置session超时响应使它失效,另一种是调用session的invalidate()方法主动使session失效。
但是需要注意的是,如果使用session.invalidate(),session在失效的同时,浏览器会自动创建一个新的session。
一般来说,要想使一个jsp中session为null,那么只有在jsp页面中使用<%@ page session="false"%>且不使用HttpServletRequest.getSession()或使用时设置为HttpServletRequest.getSession(false)。
同时需要注意的是当使用<%@ page session="false"%>,且在jsp代码中调用:
<%
HttpSession session = new request.getSession();
out.print(session);
session.invalidate();
out.print(session);
%>
时,前后两个out.print()输出的是同一个session。
但是如果不使用<%@ page session="false"%>,仅在jsp代码中使用
<%
out.print(session);
session.invalidate();
out.print(session);
%>
此时,输出的两个session不同。