会话技术概述
为了实现某一个功能(购物),浏览器和服务器之间可能会产生多次的请求和响应。从打开浏览器访问服务器开始,到访问服务器结束关闭浏览器为止,这期间产生的多次请求和响应加在一起就称之为是浏览器和服务器之间的一次会话.
会话中的数据存储问题
在一次会话中往往会产生一些数据,而这些数据是需要保存起来的,如何在一次会话中保存所产生的数据呢?
如果需要保存会话中产生的数据,可以考虑我们之前学习过的request域和ServletContext域:
(1)如果使用request作用域来保存会话中产生的数据,由于会话是多次请求,多次响应,而request域的作用范围仅仅是一次请求,所以用request域保存会话中产生的数据,作用范围太小了!
(2)如果使用ServletContext作用域来保存会话中产生的数据,ServletContext的作用范围是整个WEB应用,如果将每一个客户端和服务器产生的会话数据都保存在ServletContext域中,很可能会发生混乱.
[toc]
Cookie
Cookie是通过Set-Cookie响应头和Cookie请求头将会话中产生的数据保存在客户端,是客户端的技术
1.Cookie的工作原理
客户端向服务器发送请求,服务器获取需要保存的数据,并将需要保存的数据通过Set-Cookie响应头发送给浏览器,浏览器会以Cookie的形式保存在浏览器的内部.
当客户端再次发送请求访问服务器,服务器可以通过Cookie请求头获取上次发送给浏览器的Cookie信息,通过这种方式可以保存会话中产生的数据.
由于Cookie技术是将会话中产生的数据保存在客户端,每个客户端各自持有自己的数据,当需要时再带给服务器,因此不会发生混乱!
2.Cookie的API介绍
(1).创建Cookie对象
Cookie cookie = new Cookie(String name,String value);
(2).将Cookie对象添加到响应中
// 将指定的Cookie对象添加到响应中
// 最后随响应发送给浏览器保存(底层还是通过set-Cookie响应头将Cookie值发送给浏览器)
response.addCookie(Cookie cookie);
(3).获取请求中的Cookie信息
// 返回请求中所有的Cookie对象组成的数组.
// 如果请求中没有任何Cookie信息,该方法将会返回null
request.getCookies();
(4).setMaxAge方法 – 设置Cookie的最大生存时间
(1)如果不设置该方法,Cookie默认是会话级别的Cookie,是保存在浏览器的内存中. 随着浏览器的关闭,Cookie也会跟着销毁.
(2)如果设置了该方法,并且是一个有效的时间,Cookie将会以文件的形式保存在浏览器的临时文件夹中。
(5).setPath - 设置Cookie被带给服务器的路径
如果希望浏览器在访问当前web应用下任何一个资源时都可以带着Cookie,可以将cookie的path设置成当前web应用的虚拟路径。
cookie.setPath(request.getContextPath()+"/");
"/"作用:若当前web应用是缺省的web应用
(6).删除Cookie
- 在Cookie的API中没有提供直接删除Cookie的方法.
1.我们可以间接删除Cookie:可以向浏览器再发一个同名、同path、同domain(如果前后都不设置,则domain默认是相同的)的Cookie
2.由于浏览器是根据Cookie的名字+path+domain来区分一个Cookie的,如果两个Cookie的名字+path+domain完全一致,则浏览器会认为是同一个Cookie,这时后发的Cookie会覆盖之前发送的Cookie
3.而后发的Cookie只要设置setMaxAge方法值为0,浏览器收到之后也会将后发的Cookie立即删除。
- 也可以选择在浏览器端直接删除相应的cookie.
/**删除coolie演示
* @author: zn
* @time: 2018年8月20日,上午11:40:33
*/
public class CookieRemoved extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//删除名称为time,path为当前web应用虚拟路径的cookie
//1.创建一个key=time的cookie
Cookie cookie = new Cookie("time","");
//2.设置cookie的path
cookie.setPath(request.getContextPath()+"/");
//3.设置cookie的存活时间
cookie.setMaxAge(0);
//4.将cookie发送给浏览器
response.addCookie(cookie);
response.getWriter().write("Cookie Delete Sccess!");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
(7).cookie常用方法
方法 | 相关描述 |
---|---|
getName() | 获取Cookie的名字 |
getValue() | 获取Cookie的值 |
setValue() | 设置Cookie的值 |
setMaxAge() | 设置Cookie的最大存活时间 |
setPath() | 设置Cookie的路径 |
案例演示 - 在网页上显示上次访问时间
/**在网页上显示上次访问时间
* @author: zn
* @time: 2018年8月20日,上午10:12:25
*/
public class CookieDemo1 extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//0.处理响应正文乱码
response.setContentType("text/html;charset=utf-8");
//1.获取本次访问时间
Date date = new Date();
//2.将本次访问时间通过Cookie发送到浏览器保存
//>>创建cookie对象
Cookie cookie = new Cookie("time",date.toString());
//>>设置cookie最大存活时间
cookie.setMaxAge(3600*24);
//>>设置cookie的path为当前web应用虚拟路径
cookie.setPath(request.getContextPath()+"/");
//>>将cookie添加到response中,发送给浏览器保存
response.addCookie(cookie);
//3.获取上次访问时间
String dataTime = null;
//>>获取请求中的所有cookie(对象组成的数组)
Cookie[] cookies = request.getCookies();
if(cookies!=null) {
//>>遍历所有cookie,找出key=time的cookie
for(Cookie c : cookies) {
if("time".equals(c.getName())) {
dataTime = c.getValue();
}
}
}
//4.将上次访问时间响应到浏览器中显示
if(dataTime != null) {
response.getWriter().write("您上次访问时间是 "+dataTime);
}else {
//用户第一次访问
response.getWriter().write("您是第一次访问该网站");
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
Session
Session是将会话中产生的数据保存在服务端,是服务端的技术.
1.Session 原理
浏览器第一次发送请求需要保存数据时,服务端获取到需要保存的数据,去服务器内部检查一下有没有为当前浏览器服务的session,如果有就直接拿过来用,如果没有session就创建一个新的session拿过来用. 接着将数据保存在Session中,做出响应
当浏览器再去访问服务器时,服务器可以从session中获取到之前为当前浏览器保存的数据,通过这种方式,也可以来==保存会话中产生的数据==!
2.域对象:Session
(1).域对象
如果一个对象具有可以被看见的范围,利用该对象上的map可以在整个范围内实现数据的共享.
方法 | 相关描述 |
---|---|
setAttribute() | |
getAttribute() | |
removeAttribute() | |
getAttributeNames() |
(2).生命周期
-
创建
当第一次调用request.getSession方法时,创建session对象
在调用request.getSession()/request.getSession(true)时,如果服务器内部为当前客户端服务的session,就直接拿过来使用,如果没有就创建一个新的session使用。
request.getSession(false):如果服务器内部有为当前浏览器服务的session就直接拿过来使用,如果没有对应的session,就返回null。
-
销毁
a)超时销毁:如果session 30分钟没有被使用,则会超时销毁. 可以在web应用的web.xml文件中修改session的超时时间.
b)自杀:当调用session.invalidate方法时,将会立即销毁session
c)意外身亡:当服务器非正常关闭时,session会销毁!如果服务器正常关闭,session将会以文件的形式保存在服务器的work目录下,这个过程称之为session的钝化.
当服务器再次启动时,钝化着的session还可以再恢复回来,这个过程称之为session的活化!
3.作用范围
session作用范围是整个会话范围内
4.功能
在整个会话范围内共享数据