一、什么是session?
①:Session是一个接口,类名是HttpSession.
②:Session是一个域对象( 域对象是可以像map一样存取数据的对象,域是数据操作的有效范围 )
③:我们经常会把用户登录之后的信息,保存到Session域中.
④:一般情况下.一个会话对象表示一个客户端( 服务器会为每个客户端都创建一个Sessison会话对象 )
⑤:Session是用于维护客户端和服务器之间关联的一种技术.
二、如何创建Session和获取(id号,是否为新)?
会话是用来表示一个客户端的对象.为了区分每个客户端的不同.每个会话对象都会有一个唯一的标识,我们管它叫会话id.
①:会话如何创建?又如何获取呢?
Session会话的创建和获取是同一个API =====>>>> request.getSession();
第一次调用 request.getSession() 是创建
之后调用 request.getSession() 是获取
②:Session是否是刚创建出来,还是创建好了获取到的.也可以通过一个API ===>>> isNew() 获取到它的状态是否是新的
isNew() 方法如果返回true表示刚创建出来的.
isNew() 方法如果返回false 表示是前面创建好之后,获取到的.
③:如何获取Session会话的唯一标识 ====>>>>> getId()
String sessionId = session.getId();
public void createOrGetSession(HttpServletRequest request, HttpServletResponse response) throws IOException {
// 1、创建并获取session会话对象
HttpSession session = request.getSession();
// 2、获取Session是否是新创建出来的状态 ,true表示新创建的,false表示前面创建好,获取的
boolean isNew = session.isNew();
// 3、获取会话的唯一表示 ---会话id
String sessionId = session.getId();
response.setContentType("text/html;charset=UTF-8");
response.getWriter().write("创建或获取session对象<br>");
response.getWriter().write("isNew" + isNew + "<br>");
response.getWriter().write("sessionId--->" + sessionId);
}
三、Session域数据的存取?
参数是客户端在发请求的时候,发给服务器的额外数据 .这些数据的格式是: name=value&name=value
域数据,是服务器在实现业务过程中,自己给自己保存下来方便后面的程序使用的数据叫域数据.
setAttribute() 保存数据
getAttribute() 获取域数据
/**
* 向域对象中设置数据
* @param request
* @param response
* @throws IOException
*/
public void setAttribute(HttpServletRequest request, HttpServletResponse response) throws IOException {
request.getSession().setAttribute("sessionKey","sessionValue");
response.setContentType("text/html;charset=UTF-8");
response.getWriter().write("已经往Session域对象中保存了数据");
}
/**
* 获取域数据
* @param request
* @param response
* @throws IOException
*/
public void getAttribute(HttpServletRequest request, HttpServletResponse response) throws IOException {
Object sessionValue = request.getSession().getAttribute("sessionKey");
response.setContentType("text/html;charset=UTF-8");
response.getWriter().write("从Session域中获取前面保存的数据:" + sessionValue);
}
四、Session的超时控制
①:Session会话,一旦超时之后,Session对象就会无效( 被销毁 )
②:有一个API可以获取Session会话的超时时长
getMaxInactiveInterval():int 以秒为单位
③:Session默认的超时时长是多少?
Session默认的超时时长为: 30分钟. —tomcat服务器web.xml文件中设置了默认session存活30分钟(可以自己修改)
④:如果你想给某个特殊的Session会话单独设置超时时长,也可以通过以下api进行设置.
setMaxInactiveInterval( int ) 以秒为单位
设置值为正数时,表示在指定的秒数后Session自动超时( 超时就是失效 )
/**
* session生命周期
* 默认是:30分钟
* 设置方式:
* ①:在web.xml中进行配置,注意:我们在web.xml文件中配置的Session会话超时时间是对所有Session都生效的
* ②:通过setMaxInactiveInterval()方法,参数以秒为单位
*
* @param request
* @param response
*/
public void sessionLife(HttpServletRequest request, HttpServletResponse response){
//Session在3秒之后超时
// 第一个调用就是获取一个新的Session。如果Session已经创建过。就获取原来的会话。
HttpSession session3 = request.getSession();
// 设置过期时间为3秒
session3.setMaxInactiveInterval(3);
//Session在1分钟之后超时
// 第一个调用就是获取一个新的Session。如果Session已经创建过。就获取原来的会话。
HttpSession session60 = request.getSession();
// 设置过期时间为1分钟
session60.setMaxInactiveInterval(60);
//Session在1小时之后超时
// 第一个调用就是获取一个新的Session。如果Session已经创建过。就获取原来的会话。
HttpSession session = request.getSession();
// 设置过期时间为1小时
session.setMaxInactiveInterval(60 * 60);
//Session在1天之后超时
// 第一个调用就是获取一个新的Session。如果Session已经创建过。就获取原来的会话。
HttpSession sessionOneDay = request.getSession();
// 设置过期时间为1天
sessionOneDay.setMaxInactiveInterval(60 * 60 * 24);
//Session在1周之后超时
// 第一个调用就是获取一个新的Session。如果Session已经创建过。就获取原来的会话。
HttpSession sessionOneWeek = request.getSession();
// 设置过期时间为1周
sessionOneWeek.setMaxInactiveInterval(60 * 60 * 24 * 7);
//Session永远不超时
// 第一个调用就是获取一个新的Session。如果Session已经创建过。就获取原来的会话。
HttpSession sessionNo = request.getSession();
// 设置永远不超时
session.setMaxInactiveInterval(-1);
//Session马上超时(失效)
// 第一个调用就是获取一个新的Session。如果Session已经创建过。就获取原来的会话。
HttpSession sessionNew = request.getSession();
// 让Session对象立即过期
session.invalidate();
}
五、浏览器和服务器Session之间关联的技术内幕—见关联内幕图解
服务器会为每个客户端创建一个Session会话对象. 这个会话对象用于区分每个客户端.
会话Session是浏览器打开后,访问服务器,Session就会被创建,浏览器关闭Session就会销毁( 无效 )
如果Session会话还没有超时,就已经关闭了浏览器,为什么也找不到原来的Session会话了.
因为浏览器一关闭Session对应的Cookie就被删除了
创建Session时,默认创建的Cookie的存活时间,就是浏览器一关,Cookie也被删除了