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