1 | typora-copy-images-to: img |
一、cookie&session
第一章 会话技术
1、什么是会话
在日常生活中,从拨通电话到挂断电话之间的一连串的你问我答的过程就是一个会话。Web应用中的会话过程类似于生活中的打电话过程,它指的是一个客户端(浏览器)与Web服务器之间连续发生的一系列请求和响应过程,例如,一个用户在某网站上的整个购物过程就是一个会话。
简而言之:用户访问网站到离开网站,关闭浏览器,这个过程就叫回话。
2、会话过程要解决的问题
每个用户在使用浏览器与服务器进行会话的过程中,不可避免各自会产生一些数据,程序要想办法为每个用户保存这些数据。Servlet在会话过程中保存数据使用到的技术有两种:Cookie技术和Session技术。
【小结】
- Cookie和Session技术都是在会话期间产生的 ;
- Cookie和Session的作用都是保存数据 ;
第二章 Cookie技术
1、Cookie是什么
Cookie英文意指饼干,Cookie就是服务器暂存放在我们电脑上的一笔资料(where?打开浏览器),使用我们电脑来保存一些服务器希望保存的内容。Cookie是由服务器端生成,发送给浏览器,浏览器会将Cookie的key/value保存到某个目录下的文本文件内,下次请求同一网站时就发送该Cookie给服务器前提是浏览器设置为启用cookie。
2、Cookie基本API
Cookie的基本API包括Cookie的创建,往Cookie中添加数据,获取Cookie中的数据以及将Cookie响应给浏览器。
方法 | 使用示例 | 说明 |
---|---|---|
创建 | Cookie(String name,String value) | Cookie c1 = new Cookie(“name”,”tom”) |
获取name值 | String getName() | c1.getName() |
获取value值 | String getValue() | c1.getValue() |
发送cookie | void addCookie(Cookie cookie) | response.addCookie(c1) response |
设置cookie的值 | void setValue(String value) | c1.setValue(“李四”) |
获取所有cookie | Cookie[] getCookies() | rquest.getCookies() request |
3、Cookie的存活时间&有效路径
将浏览器关闭。然后再打开一个新的浏览器,登录页面上记录的用户名和密码消失了,查看浏览器中的cookie,发现之前保存的cookie都消失了。我们再次登录发现之前设置的Cookie的到期时间为”浏览器会话结束”。
如果,我们想让这个cookie在浏览器关闭后能够在一段时间内都存在,比如记住用户名或密码一周。我们可以通过设置Cookie的最大存活时间来对这个Cookie进行设置。
【概念】
- 会话级别 的Cookie:浏览器关闭后消失;
- 持久性 的Cookie:浏览器关闭后能够保存一段时间;
3.1 Cookie的最大存活时间
设置Cookie的最大存活时间的方法是:
方法 | 使用示例 | 说明 |
---|---|---|
void setMaxAge(int seconds) | userNameCookie.setMaxAge(60*60); |
设置Cookie的有效时间: 如果没有设置,cookie只会保存在浏览器的缓存中,浏览器关闭后cookie立即被删除。 如果设置有效时间,在时间范围内,cookie被写入到浏览器端,关闭浏览器下次访问仍可活的,直到过期。 |
【注意事项】Cookie分类
- 会话级别的Cookie:浏览器关闭后销毁;
- 持久型的Cookie:设置最大存活时间;
3.2 Cookie的有效路径
Cookie的有效路径指的是cookie允许被访问的路径。设置路径,以及子路径都被允许访问。方法如下:
方法 | 使用示例 | 说明 |
---|---|---|
void setPath(String path) | cookie.setPath(“/web”) cookie.setPath(“/“) |
常见设置:cookie.setPath(“/“)指的是当前tomcat下的所有的web项目都可以访问这个cookie; cookie.setPath(“/web”):指的是/web路径及其子路径可以访问这个cookie;【结果】 |
- 当给cookie设置有效路径”/web/a/b”后:
- 访问路径:/web 获取不到cookie;
- 访问路径:/web/a/b/c 能获取到cookie ;
- 访问路径:/web/a/b 能获取到cookie ;
- 访问路径:/web/a/d 获取不到;
【结论】
- 当设置cookie的有效路径后,只能在有效径或其子路径下访问这个cookie;
- 如果不给cookie设置有效路径,默认的有效路径为”/“ ,即在当前tomcat下的任意访问路径均可获取这个cookie;
- 一般情况下不必给cookie设置有效路径;
4、Cookie删除
通常情况下,如果浏览器中的cookie存储的太多,我们需要手动清除浏览器中的cookie。这是通过客户端的技术删除存储在浏览器中的cookie。Servlet中没有专门提供API去删除cookie。我们可以通过以下方式删除cookie;
【操作步骤】
- 创建与要删除的cookie同名的cookie,将其值设置成””;
- 将这个cookie的最大存活时间设置成0;
- 设置这个cookie的有效路径(与原cookie的有效路径一致);
- 将这个新的cookie响应给浏览器,置换原来的cookie;
【小结】让cookie消失的几种方法
- 没有设置最大存活时间的cookie,浏览器关闭后cookie立即消失;
- 使用浏览器手动清除cookie;
- 浏览器禁用cookie;
- 通过Servlet技术将cookie删除;
5、Cookie小结
- Cookie:服务器在客户端(浏览器)存储数据的技术;
- Cookie分类:
- 会话级别:没有设置最大存活时间的cookie,浏览器关闭后消失;
- 持久级别:设置了最大存活时间,浏览器关闭后不会消失;
- Cookie基本API:
- 创建Cookie:Cookie c = new Cookie(“name”,”zhangsan”);
- 获取name值:c.getName();
- 获取value值:c.getValue();
- 将cookie响应给浏览器:response.add(c);
- 获取所有的cookie:Cookie[] cookies = request.getCookies();
- Cookie的有效时间:
- setMaxAge(int seconds):以秒为单位设置cookie的存活时间;
- Cookie的有效路径:
- setPath(String path):设置cookie的有效路径,在这个路径及其子路径下有效;
- Cookie删除:
- 客户端:
- 会话级别的cookie,关闭浏览器后cookie立即消失;
- 禁用cookie;
- 手动清除cookie;
- 服务端:
- 通过Servlet,将原来的cookie置换;
- 客户端:
- Cookie的优势及弊端:
- 优势:
- 为服务端标识用户提供依据;
- 减轻了服务端数据存储的压力;
- 弊端:
- 数据存储在客户端不安全;
- 存储的数据大小受限,一个cookie存储的数据最大为4K;
- 优势:
二、 Session技术
1、Session是什么
Session是服务器为每个访问这个服务器的客户端用户创建的一个容器。这个容器中存储的数据能够在多个request之间实现共享。而且,这个容器只属于当前这个用户。
2、Session是怎么标识每一个用户的
表面上,我们说Session容器是属于某一个用户。其实在会话过程中,只有客户端(浏览器)和服务器两个角色。所以,Session容器标识的不是用户,而是当前用户正在使用的浏览器。浏览器与服务器交流是通过给服务器发送请求实现的,浏览器的每次请求中如果都有一个相同的标记用来标记session。服务器就能够识别这个用户了。
这个标记叫做JSESSIONID。我们重新演示,cookie的setPath练习,发现服务器启动后,浏览器的每次请求都会携带一个name属性值为”JSESSIONID”的cookie,这个cookie的值在每次请求过程中都是相同的。
3、Session的作用
- 为每个访问服务器的用户创建一个存储数据的容器;
- 容器中的数据在多个请求之间共享;
4、Session容器创建
Session容器的创建,调用的方法是:request.getSession()。具体方法如下:
【练习】创建session对象
HttpSession session = new request.getSession();
session是用来标识用户的,所以不同用户访问网站,服务器都会创建不同的session保存在不同的内存中,所以session的内存地址不一样。我们可以通过不同浏览器访问同一个网站,模仿不同用户访问网站,从而打印的色三四年地址不同。
5、Session常用API
Session常用API包括:往session容器中存储数据,删除数据,获取数据
方法 | 使用示例 | 说明 |
---|---|---|
void setAttribute(String name,Object value) | session.setAttribute(“loginUser”,user) | 将一个对象与一个名称关联 之后存储到session中 |
Object getAttribute( String name) | session.getAttribute(“loginUser”) | 通过名称获取session 中的数据 |
void removeAttribute(String name) | session.removeAttribute(“loginUser”) | 根据指定名称删除 session中的数据 |
String sessionId = session.getId(); | session.getId() | 获取session的id |
6、Session的生命周期
6.1 Session创建
当客户端浏览器第一次访问服务器时,服务器为每个浏览器创建不同的HttpSession对象。在服务器端使用request.getSession()方法来获得HttpSession对象
当第一次执行 request.getSession()是session对象就被创建了。后续的request.getSession()只能获取已创建的session。
6.2 Session使用
对session中的数据进行增,删,获取…
6.3 Session销毁
方式一:时间超出了session的存活时间
session的默认存活时间是30分钟,在tomcat的全局配置文件web.xml中。(路径:tomcat/config/web.xml)
我们可以在web.xml中自己设置这个存活时间。我们设置的这个时间会覆盖原来的存活时间。
【注意】
1 | 注意:30分钟从什么时候开始计算? |
【案例】手动配置session的存活时间
将session-config这段配置复制到自己项目中的web.xml中。修改存活时间为1,测试生存时间。
方式二:在Servlet中手动销毁
SessionTwoServlet.java 手动销毁session,调用的方法是:session.invalidate()方法;
方式三:服务器非正常关闭【了解】
如果正常关闭服务器,session的信息,会被序列化硬盘中,保存在tomcat的work\Catalina\localhost\web,当tomcat下一次启动的时候,会把session加载回来。序列化的文件会被销毁。
6.4 浏览器关闭后,session持久化方案
通过上面的例子我们发现,浏览器关闭后,JSESSIONID就消失来,再次访问的时候又重新创建了一个新的session对象。这样,是比较消耗资源的。如何在浏览器关闭后,session能够继续存在呢?
答案:session之所以重新创建是因为,浏览器关闭后JESSIONID这个cookie消失了。所以,就不能够在标识这个session了。如果能够让cookie不消失(或者存活时间长点)就能够在很长一段时间内把这个标识发送给Servlet了。此时Servlet就能够找到之前创建的session对象了。
【实现方案】
1 | 1. 在Servlet中手动创建JESSIONID; |
7、Servlet作用域总结
ServletContext域:
一个WEB应用(项目)对应一个ServletContext,这个对象中保存的数据正在整个WEB项目中都有效;
- 创建:服务器启动的时候;
- 销毁:服务器关闭或项目移除后;
HttpSession:
一次会话给客户端(浏览器)创建一个session。这个对象中保存的数据,一次会话(多次请求)内数据有效;
- 创建:服务器第一次调用getSession()的时候;
- 销毁:
- 服务器非正常关闭(正常关闭:Session被序列化);
- Session过期了:默认存活时间30分钟;
- 手动调用session的invalidate()方法;
HttpServletRequest:
一次请求创建一个request。这个对象中保存的数据,一次请求(请求链)内数据有效;
- 创建:客户端向服务器发送一次请求;
- 销毁:服务器为这次请求做出响应之后,销毁request;
【API操作】操作三个作用域对象的API
- 存储数据:setAttribute(name,value);
- 获得数据:getAttribute(name);
- 删除数据:removeAttribute(name);