目录
一、会话技术
在生活中我们和别人的聊天其实就算是会话,软件中的会话也类似,就像是我们要访问数据库就要和数据库保持连接(connection),这里的连接就是一个会话。
1、会话的建立和作用
浏览器第一次给服务器资源发送请求时,会话建立,直到有一方断开为止。会话技术就是用来记录这次会话中客户端的状态与数据的。
2、会话技术分为Cookie和Session
二、Cookie
1、Cookie的定义
数据放在浏览器端的技术叫Cookie技术。
2、Cookie的特点
数据存储在客户端本地,减少了服务器端的存储的压力,但是安全性不好,客户端可以直接清除Cookie。
3、服务器怎么将Cookie设置到浏览器客户端
(1)创建Cookie
Cookie cookie = new Cookie(cookieName, cookieValue);
(3)代码实现
@WebServlet("/setCookie")
public class SetCookieServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("SetCookieServlet.service");
Cookie cookie = new Cookie("goods", "Honor");
resp.addCookie(cookie);
}
}
通过代码设置好cookie后,我们可以在浏览器端访问这个servlet,并观察cookie的值,可以看到第一条就是我们设置的值。
3、服务器怎么接收客户端携带的Cookie
cookie信息是以请求头的方式发送到服务器端的
(1)通过request获得所有的Cookie,得到的时Cookie数组
Cookie[] cookies = request.getCookies();
(2)遍历Cookie数组,通过Cookie的名称获得我们想要的Cookie
(3)代码实现
@WebServlet("/getCookie")
public class GetCookieServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("GetCookieServlet.service");
Cookie[] cookies = req.getCookies();
for (Cookie cookie : cookies) {
System.out.println("name: " + cookie.getName() + ", value: " + cookie.getValue());
}
}
}
4、Cookie的有效时间
(1) 默认情况下,当浏览器关闭后,Cookie数据就会被销毁
(2)持久化存储,自己设置cookie的有效时间
cookie.setMaxAge(10 * 60); //保存10分钟,设置Cookie信息在浏览器的磁盘文件中存储的时间是10分钟,过期浏览器自动删除该Cookie信息,这里就算是没有关闭浏览器过了有效时间之后浏览器也会自动删除cookie信息。
(3)cookie.setMaxAge(10 * 60)方法的参数的含义:
方法的参数是一个以秒为单位的整数,指定cookie的最大年龄:
- 正数:将Cookie数据写到硬盘的文件中。持久化存储。并指定cookie的存活时间,时间到后,cookie文件自动失效。
- 负数:浏览器关闭的时候Cookie就丢失,默认值就是负数
- 零:表示删除同名的Cookie数据。
(4)删除客户端的 Cookie: 如果想删除客户端已经存在的Cookie信息,就是将持久化时间设置为0即可。
三、Session
1、session的定义
Session是服务器端的会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中。
2、怎样获得Session对象
客户端需要每次都携带一个标识的ID:JSESSIONID去服务器寻找自己的内存空间(也就是对应的Session)。所以说Session技术是基于Cookie技术的,Session需要借助于Cookie存储客户的唯一标识JSESSIONID,以便客户能找到自己的Session。
有两种getSession方法:
HttpSession session = request.getSession(false);
HttpSession session = request.getSession(); //参数默认情况下为true:request.getSession(true);
(1)request.getSession(false)
得到session对象,原来有Session就直接返回,没有就返回null。
(2)request.getSession(true) 等价于 request.getSession()
创建或得到session对象,原来有Session就直接返回,没有就自动创建新的session对象,然后再返回新创建的这个Session对象。
3、怎样向Session中存取数据
session对象具有如下三个方法:
(1)session.setAttribute(String name,Object obj); //向Session里面存入数据,参数分别为:
数据的名称,数据的值;
(2)session.getAttribute(String name); //通过数据的名称拿到Session里面的数据的值
(3)session.removeAttribute(String name); //通过数据的名称移除Session里面的数据
4、Session对象的生命周期
(1)创建
在第一次执行request.getSession()时创建Session对象
(2)销毁
- 服务器关闭时销毁
- 手动销毁session (注销或者退出)//session.invalidate();
- session过期/失效(默认30分钟)时销毁
这里默认的30时分钟是从不操作服务器端的资源开始计时的,可以在项目的web.xml中进行配置
Session的失效时间。
5、Session的范围
(1)当在同一个浏览器中同时打开多个标签,发送同一个请求或不同的请求,仍是同一个session;
(2)当使用不同的浏览器时,即使发送相同的请求,也是不同的session;
(3)当把同一个浏览器关闭,再重新打开,即使发送相同的请求时,也是不同的session.
四、Cookie和Session的联系和区别
Session技术是基于Cookie技术的,客户无法直接找到属于自己的Session,需要借助于Cookie来存储客户的唯一标识JSESSIONID,以便客户能找到自己的Session。
1、联系
以加入购物车的栗子来说明Cookie和Session之间的联系:
图中标注的数字如下:
(1)客户端发出张三申请加入购物车的请求,并且携带商品信息
(2)(3)服务器端收到请求把数据保存到张三的Session里面,并给张三返回一个cookie信息,里面保存了SessionID:001
(4)客户端发出张三申请结算的请求并携带者SessionID:001
(5)客户端收到请求之后,根据cookie里面的SessionID:001找到张三的商品信息并进行结算。
2、区别
- Session数据存储在服务器端,Cookie在客户端
- Session没有数据大小限制,Cookie有
- Session数据安全,Cookie相对于不安全