Cookie 对象
cookie是一种客户端技术(浏览器技术),由服务器创建,响应给客户端的技术。数据存储在浏览器中。
-
cookie作用:
- 数据不需要经过网络传输,可以提高网页效率,减轻服务器的负载
-
cookie不建议存放大量数据,存放大小在4k左右。一般用来储存不需要访问后台,只有浏览器需要的数据
Cookie的创建和发送
-
cookie的创建:
- Cookie cookie = new Cookie(“键”, “值”);
-
cookie的发送:
- response.addCookie(cookie对象);
// 创建Cookie对象 Cookie cookie = new Cookie("uname","admin"); // 响应Cookie对象给浏览器 response.addCookie(cookie);
Cookie的获取
-
只能获取cookie的数组Cookie[],需要通过遍历,获取具体的cookie对象,然后再通过cookie的键得到对应的值
// Cookie的获取 Cookie[] cookies = request.getCookies(); // 非空判断 if (cookies != null && cookies.length > 0) { for (Cookie cookie : cookies) { // 获取cookie的名称 String name = cookie.getName(); // 获取cookie的值 String value = cookie.getValue(); // System.out.println(name +"=" + value); // 获取指定的cookie对象 if("uname".equals(name)) { System.out.println("Cookie的值为:" + value); } } }
Cookie到期时间的设定
到期时间用来指定该 cookie 何时失效。默认为当前浏览器关闭即失效。
-
我们可以手动设定 cookie 的有效时间(通过到期时间计算),通过 setMaxAge(int time); 方法设定 cookie 的最大有效时间,以秒为单位。
-
参数的三种情况:
-
负整数:
- cookie 的 maxAge 属性的默认值就是-1,表示只在浏览器内存中存活,一旦关闭浏览器窗口,那么 cookie 就会消失
-
正整数:
- 表示 cookie 对象可存活指定的秒数
- 当生命大于 0 时,浏览器会把 Cookie 保存到硬盘上,就算关闭浏览器,就算重启客户端电脑,cookie 也会存活相应的时间
-
零:
- cookie 生命等于 0 是一个特殊的值,它表示 cookie 被作废
- 也就是说,如果原来浏览器已经保存了这个 Cookie,那么可以通过 Cookie 的 setMaxAge(0)来删除这个 Cookie
- 无论是在浏览器内存中,还是在客户端硬盘上都会删除这个 Cookie。
// 创建cookie对象 Cookie cookie = new Cookie("name", "admin"); // 设置cookie的到期时间 // 正整数:表示存活指定秒数 //cookie.setMaxAge(20); // 存活15秒 // 设置3天失效 //cookie.setMaxAge(3*24*60*60); // 负整数:在浏览器中存活 // cookie.setMaxAge(-10); // 零:表示即刻删除 cookie.setMaxAge(0); // 响应cookie给客户端 response.addCookie(cookie); // 删除cookie对象 Cookie cookie02 = new Cookie("uname2", null); // 删除cookie cookie02.setMaxAge(0); // 响应给客户端 response.addCookie(cookie02);
-
Cookie注意事项
- Cookie不跨电脑和浏览器
- Cookie不支持中文
- 如果有中文则通过 URLEncoder.encode()来进行编码,获取时通过 URLDecoder.decode()来进行解码
- 不同的浏览器对Cookie也有限定,Cookie的存储有是上限的
- Cookie是存储在客户端(浏览器)的,而且一般是由服务器端创建和设定
Cookie的覆盖
在相同域名(domain)下和同路径(path)下,如果出现相同name的cookie对象,后面的cookie对象会将前面的覆盖。
Cookie的路径
- 只有访问的路径中包含cookie的path的值,才能访问到该cookie对象
- 设置当前服务器下所有项目都能访问到的cookie对象:cookie.setPath("/");
Session 对象
Session的概述
session是一次会话,在会话中可以包含多个请求。在会话中数据共享。
Session的获取
-
语法:HttpSession session = request.getSession();
- 如果session不存在,则创建一个新的session;如果session存在,则获取存在的session
HttpSession session = request.getSession();
Session的方法
-
获取会话标识符:session.getId();
-
获取创建时间:session.getCreationTime();
-
获取最后一次访问时间:session.getLastAccessedTime();
-
是否是新的会话:session.isNew();
// 获取会话标识符 String id = session.getId(); System.out.println("获取会话标识符:" + id); // 获取创建时间 long createTime = session.getCreationTime(); System.out.println("获取创建时间:" + createTime); // 获取最后一次访问时间 long lastAccessTime = session.getLastAccessedTime(); System.out.println("获取最后一次访问时间:" + lastAccessTime); // 是否是新的会话 boolean flag = session.isNew(); System.out.println("是否是新的会话:" + flag);
会话标识 JSESSIONID
- 当每一次请求到达服务器时,如果使用了session对象,都会判断客户端是否回传了一个JSESSIONID的cookie对象
- 如果没有回传,则服务器会新建一次sessionId,并响应给客户端,浏览器会存一个相同值的JSESSIONID
- 如果回传了,则会判断回传的值是否和后台的值一致
- 如果一致,则表示是同一个会话,数据都可共享
- 如果不一致,则服务器会新建一次sessionId,并响应给客户端,浏览器会存一个相同值的JSESSIONID
- JSESSIONID 的 cookie,这是一个比较特殊的 cookie:
- 当用户请求服务器时,如果访问了 session,则服务器会创建一个名为 JSESSIONID,值为获取到的 session(无论是获取到的还是新创建的)的 sessionId 的 cookie 对象,并添加到 response 对象中,响应给客户端,有效时间为关闭浏览器。
- 所以 Session 的底层依赖 Cookie 来实现。
Session 域对象
Session 用来表示一次会话,在一次会话中数据是可以共享的,这时 session 作为域对象存在。
- 方法:
- setAttribute(name,value):方法向域对象中添加数据
- getAttribute(name):从域对象中获取数据
- removeAttribute(name):从域对象中移除数据
Session的销毁
-
默认到期时间(达到最大不活动时间)
-
在指定时间段内没有任何请求,则失效;在时间到期之前有任何请求,则会重新计时
-
Tomcat服务器默认session的到期时间是30分钟
-
可以修改默认的到期时间:在Tomcat安装目录下的conf目录中的web.xml中,单位是分钟
<session-config> <session-timeout>30</session-timeout> </session-config>
-
-
手动到期时间
- 通过session.setMaxInactiveInterval(int);来设定 session 的最大不活动时间,单位为秒。
- 通过 getMaxInactiveInterval();方法来查看当前 Session 对象的最大不活动时间。
-
销毁session对象
- session.invalidate();
// Session的获取 HttpSession session = request.getSession(); // 通过 getMaxInactiveInterval();方法来查看当前 Session 对象的最大不活动时间。 int time = session.getMaxInactiveInterval(); System.out.println("当前 Session 对象的最大不活动时间:" + time); // 通过session.setMaxInactiveInterval(int);来设定 session 的最大不活动时间,单位为秒。 //session.setMaxInactiveInterval(10); //10秒钟失效 // 销毁session对象 session.invalidate();
-
关闭浏览器
- session的底层依赖cookie,默认只在浏览器存活,关闭浏览器就失效。
-
关闭服务器
- 只要在非正常关闭服务器时,才会销毁session
- 如果是正常关闭服务器(选择服务器,右键选择stop),session不会失效。
- 服务器会将session钝化(将数据从内存中存到磁盘中),下次访问session时会活化(从磁盘中读取到内存中)
- 在Tomcat安装目录的work目录下,存放一个叫做SESSION.ser的文件
ServletContext 对象
每一个web应用有且只有一个ServletContext对象,又称为application对象。
ServletContext 的作用
- 作为域对象用来共享数据,此时数据在整个应用程序中共享
- 该对象中保存了当前应用程序相关信息
ServletContext 的获取
- 通过request对象获取:request.getServletContext();
- 通过session对象获取:request.getSession().getServletContext();
- 通过servletConfig获取:getServletConfig().getServletContext();
- 直接获取:getServletContext();
常用方法
-
获取服务器的版本信息 :getServerInfo();
-
获取资源在服务器的真实路径:getRealPath();
/** * 获取ServletContext对象 */ // 通过request对象获取 ServletContext servletContext = request.getServletContext(); // 通过session对象获取 ServletContext servletContext2 = request.getSession().getServletContext(); // 通过servletConfig获取 ServletContext servletContext3 = getServletConfig().getServletContext(); // 直接获取 ServletContext servletContext4 = getServletContext(); // 1)获取服务器的版本信息 getServerInfo() String serverInfo = request.getServletContext().getServerInfo(); System.out.println("服务器版本信息:" + serverInfo); // 2)获取资源在服务器的真实路径 getRealPath(); String realPath = servletContext.getRealPath("/"); System.out.println("获取资源在服务器的真实路径:" + realPath);
ServletContext 域对象
在整个应用程序中都有效;服务器关闭即失效。
- 方法:
- setAttribute(name,value):方法向域对象中添加数据
- getAttribute(name):从域对象中获取数据
- removeAttribute(name):从域对象中移除数据
Servlet三种域对象的区别
域对象 | 特点 |
---|---|
request 域对象 | 一次请求中有效(请求转发有效) |
session 域对象 | 一次会话中有效(请求转发和重定向都有效) |
servletContext 域对象 | 整个应用中有效(服务器不关闭就都有效) |
- 如何选择:
- 尽可能选择小范围的(范围越大,所需要资源越多)