什么是会话呢?
所谓的会话过程就是指从打开浏览器到关闭浏览器的过程。
Cookie和Session指的又是什么呢?
大家都知道,http是无状态的协议,客户每次读取web页面时,服务器都打开新的会话,而且服务器也不会自动维护客户的上下文信息。如果说我们要实现购物车添加或删除商品的功能的话,我们就需要使用到Cookie和Session技术。也就是说,Cookie和Session是域对象。所谓域就相当于给存储的内容设置一个边界,将存储的内容存储到这片区域内。
什么是HttpServletResponse转发和重定向?
因为将下面的域对象的时候会用到转发和重定向的知识点,所以在此补充一下.......
①.转发:转发时浏览器地址栏不会发生改变。
转发时浏览器发送了一次请求。
转发时发生在服务器内部,浏览器不知道转发的发生。
RequestDispatcher rd = request.getRequestDispatcher("转发到的页面");
rd.forward(request, response);
②.重定向:重定向时地址栏发生改变。
重定向时浏览器发送了两次请求。
重定向时发生在浏览器端的,浏览器知道重定向的发生。
response.sendRedirect("重定向到的页面");
Request域、ServletContext域、pageContext域、Cookie域、Session域的区别是什么?
用在网上购买东西这个案例来剖析这个问题。
①.request域:表示的是一次请求范围内。
如果说,我要去购买一件上衣向服务器发送一个购买请求,它返回给我一个购买成功的响应;当我再去购买一个裤子的时候就相当于又一个请求,那么这时候用转发的话当然就不行了,如果用重定向的话可以解决这个问题,只不过比较麻烦。然后把里面所购买的上衣的数据从request域拿出来和第二个请求拼接在一起在存入request域中。
但是当我要去结算的,就是在另一个Servlet中,这个时候我的request域中的数据就会全部丢失。具体如下图所示:
②.ServletContext域和pageContext域:
这两个域在我看来没有本质上的区别,可以理解为服务器端的共享空间。只不过说,ServletContext域表示的是整个web服务,而pageContext域表示的是一次请求。
如果说,我要购买一件上衣,向服务器发送一个请求,服务器返回给我一个购买成功的请求 ,同样的再去购买一条裤子也是一样的。看来一切都是正常的,结算也可以去结算界面结算我的总金额。
但是,我要说的是,因为这是一个购物界面,所以就不会只是你一个用户。因为这是一个服务器端的共享空间,所以当别人也去购买东西添加购物车后,你去结算的时候就包括自己和别人共同的东西。具体如下图所示:
③.Cookie域:
Cookie域就是所谓的会话技术,或者说是客户端技术。
同样去买一件上衣,这个时候就会把上衣这个对象存入的开辟的Cookie空间中, Cookie空间为此对象绑定一个唯一的标识然后以响应头方式返回给客户端,当再去购买裤子的时候会带着这个唯一标识以请求头的方式存入到Cookie空间中,同时为它绑定唯一的标识。因为Cookie域保存在自己浏览器内部,与别人互不干扰,但因为是客户端技术,所以安全性不高。具体如下图所示:
④.Session域
Session域就是另一种会话技术,也叫做服务器端技术。Session的底层也是基于Cookie的,只不过有自己的改变。
和Cookie一样,去买一件上衣,这个时候就会把上衣这个对象存入的开辟的Session空间中, Session空间为此对象生成一个唯一的Key值,当再去购买裤子的时候会带着这个唯一的Key值存入到Cookie空间中,同时为它绑定唯一的Key值。因为Session域同样保存在自己浏览器内部,与别人互不干扰,它相较于Cookie而言是服务器技术,较安全。具体如下图所示:
Cookie域的常用方法:
1.获取Cookie的内容:
Cookie[] cookies = request.getCookies();
因为如果我们打开京东的同时,同时去打开淘宝等,这个时候就会存在多个Cookie
2.Cookie的构造方法:Cookie(String name,String value)
3.获取Cookie的值:String getValue()
4.获取Cookie的名称:String getName()
5.设置有效的时间:void SetMaxAge(int expiry)
①.会话级别的Cookie:默认一个会话的时间,默认保存在浏览器内存中
②.持久的Cookie:把Cookie保存到磁盘上,通过(5.)设置。eg:保存用户名,QQ...等
SetMaxAge(0):提前将Cookie结束
前提条件:有效路径必须相同,从别的Servlet停止,首先要设置同一路径。
6.设置有效路径: void SetPath(String url)
7.设置有效域名:void SetDomain(String patten)
eg:我要登录百度,那么:www.baidu.com
登录百度书城:book.baidu.com
SetDomain(".baidu.com");
Session域的常用方法:
1. 如何获得session对象
HttpSession session =request.getSession();
2. 如何存取数据
String age = (String)session.getAttribute("age");
//getAttribute(String name)
//通过Session来存入内容,然后来获取这指定的值,或添加指定的值
session.setAttribute("age","20");
session.removeAttribute(“age”);
3.String getId() 获取Session的唯一id
4.void invalidate() 销毁Session