HttpSession概述
HttpSession是由JavaWeb提供的,用来会话跟踪的类。session是服务器端对象,保存在服务器端。
HttpSession是Servlet三大域对象之一(request、session、application(ServletContext)),所以它也有setAttribute()、getAttribute()、removeAttribute()方法。
HttpSession底层依赖Cookie,或是URL重写。
HttpSession的作用
会话范围:会划范围是某个用户从首次访问服务器开始,到用户关闭浏览器结束。
Servlet中得到session对象:HttpSession session = request.getSession();
jsp中得到Session对象:Session是jsp内置对象不用创建可以直接使用。
Session域的相关方法:
void setAttribute(String name,Object value);
object getAttribute(String name);
void removeAttribute(String name);
HttpSession原理
request.getSession()方法
获取Cookie中的JSESSIONID:
如果sessionId不存在,创建session,把session保存起来,把新创建的sessionId保存到Cookie中
如果Session存在,通过sessionId查找session对象,如果没查到,创建session,把session保存起来,把新创建的sessionId保存到Cookie中
如果sessionId存在,通过sessionId查找到了session对象,那么就不再创建session对象了
返回session
如果创建了新的Session,浏览器会得到一个包含了sessionId的Cookie,这个Cookie的声明为-1,即只在浏览器内存中存在,如果不关闭浏览器,那么Cookie一直存在。
JSP会自动创建Session
Servlet不会,只有在第一次获取session时,才会创建reques.getSession();
reques.getSession(false):如果session缓存中(如果Cookie不存在),不存在session,那么返回null,而不会创建session对象
HttpSession的其他方法
String getId():获取sessionId
int getMaxInactiveInterval():获取session可以的最大活动时间(秒),默认为30分钟。当session在30分钟内没有使用,Tomcat会在session池中移除
void invalidate():让session失效。调用这个方法会让session失效
boolean isNew():查看session是否为新。当客户端第一次请求时,服务器为客户端创建session,但这时服务器还没有响应客户端,也就是没有把sessionId返回时为true。request.getSession().isNew():可以判断是在创建session还是返回session
URL重写
当客户端禁用Cookie时,就无法得到sessionId
可以使用URL重写来替代Cookie
response.getSession()检查cookie没有后会寻找jsessionid参数,都没有则创建session
让网站所有的超链接、表单中都添加一个特殊的请求参数,即sessionId
这样服务器可以通过获取请求参数得到sessionId,得到session对象
response.encodeURL(url):该方法对url进行智能重写:当请求中没有归还sessionId这个Cookie,那么该方法会重写url,否则不重写。