Servlet学习之Cookie
转载请注明出处:http://write.blog.youkuaiyun.com/mdeditor#!postId=77284800
预备知识
什么是一次web会话?
会话是web技术中的一个术语,可以简单的理解为:用户打开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,这个过程称为一个会话。
如果在打开一个浏览器访问一个页面后,再打开一个浏览器访问同一个页面,那这就是有两个会话;而打开一个浏览器访问一个页面后,通过这个页面上的某个超链接是从新的浏览器打开的,那依然只算一个会话。
Cookie
什么是Cookie
Cookies 是存储在客户端计算机上的一小段文本文件,并保留了各种跟踪信息。伴随着用户请求和页面在 Web 服务器和浏览器之间传递。用户每次访问站点时,Web 应用程序都可以读取 Cookie 包含的信息
Cookie的作用
我们在浏览器中,经常涉及到数据的交换,比如你登录邮箱,登录一个页面。我们经常会在此时设置30天内记住我,或者自动登录选项。那么它们是怎么记录信息的呢,答案就是今天的主角cookie了,Cookie是由HTTP服务器设置的,保存在浏览器中,但HTTP协议是一种无状态协议,在数据交换完毕后,服务器端和客户端的链接就会关闭,每次交换数据都需要建立新的链接。就像我们去超市买东西,没有积分卡的情况下,我们买完东西之后,超市没有我们的任何消费信息,但我们办了积分卡之后,超市就有了我们的消费信息。cookie就像是积分卡,可以保存积分,商品就是我们的信息,超市的系统就像服务器后台,http协议就是交易的过程。
Cookie常用场景
1.记录用户的事件
2.浏览历史记录
3.用户名和密码的记录
等待
Cookie的分类
cookie分为会话cookie和持久cookie,会话cookie是指在不设定它的生命周期expires时的状态,前面说了,浏览器的开启到关闭就是一次会话,当关闭浏览器时,会话cookie就会跟随浏览器而销毁。当关闭一个页面时,不影响会话cookie的销毁。会话cookie就像我们没有办理积分卡时,单一的买卖过程,离开之后,信息则销毁。
持久cookie则是设定了它的生命周期expires,此时,cookie像商品一样,有个保质期,关闭浏览器之后,它不会销毁,直到设定的过期时间。对于持久cookie,可以在同一个浏览器中传递数据,比如,你在打开一个淘宝页面登陆后,你在点开一个商品页面,依然是登录状态,即便你关闭了浏览器,再次开启浏览器,依然会是登录状态。这就是因为cookie自动将数据传送到服务器端,在反馈回来的结果。持久cookie就像是我们办理了一张积分卡,即便离开,信息一直保留,直到时间到期,信息销毁。
Cookie的细节知识
1.cookie是在服务端创建的
2.cookie是保存在浏览器这端的
3.cookie的生命周期可以通过cookie.setMaxAge();如果不设置,关闭浏览器就destroy了
4.cookie可以被多个浏览器共享
5.怎么理解:把cookie假设成一张表 名字(String):值(String)。所有共享这张表,名字如果重复了就会替换掉存在的cookie值。
6.一个WEB应用可以保存多个cookie
7.cookie存放的时候是以明文方式存放的,因此安全比较低,我们可以通过加密后保存,可以用md5(不可逆)算法加密(想起了base64),经过md5加密后存放到数据库,用户输入密码后加密然后再和数据库里面的匹配。
8.一个web应用可以给浏览器发送多个cookie,一个浏览器可以存储多个web应用提供的cookie。一般只允许存放300个cookie,每个web应用最多放 20个,每个cookie大小4KB,因此不会塞满硬盘,也不会被用作“拒绝服务”攻击手段。
9.cookie的默认生命周期是会话级别的,关闭浏览器后就被删除,可以通过setMaxAge()设置cookie 的生命周期。setMaxAge(0)删除该cookie:要保持path一致,否则无法删除,
如何使用Cookie
Servlet Cookies 方法
以下是在 Servlet 中操作 Cookies 时可使用的有用的方法列表。
序号 | 方法 & 描述 |
---|---|
1 | public void setDomain(String pattern)该方法设置 cookie 适用的域,例如 w3cschool.cc。 |
2 | public String getDomain()该方法获取 cookie 适用的域,例如 w3cschool.cc。 |
3 | public void setMaxAge(int expiry)该方法设置 cookie 过期的时间(以秒为单位)。如果不这样设置,cookie 只会在当前 session 会话中持续有效。 |
4 | public int getMaxAge()该方法返回 cookie 的最大生存周期(以秒为单位),默认情况下,-1 表示 cookie 将持续下去,直到浏览器关闭。 |
5 | public String getName()该方法返回 cookie 的名称。名称在创建后不能改变。 |
6 | public void setValue(String newValue)该方法设置与 cookie 关联的值。 |
7 | public String getValue()该方法获取与 cookie 关联的值。 |
8 | public void setPath(String uri)该方法设置 cookie 适用的路径。如果您不指定路径,与当前页面相同目录下的(包括子目录下的)所有 URL 都会返回 cookie。 |
9 | public String getPath()该方法获取 cookie 适用的路径。 |
10 | public void setSecure(boolean flag)该方法设置布尔值,表示 cookie 是否应该只在加密的(即 SSL)连接上发送。 |
11 | public void setComment(String purpose)该方法规定了描述 cookie 目的的注释。该注释在浏览器向用户呈现 cookie 时非常有用。 |
12 | public String getComment()该方法返回了描述 cookie 目的的注释,如果 cookie 没有注释则返回 null。 |
在Servlet中设置Cookie
1.创建Cookie
Cookie cookie = new Cookie("key","value");//只能传入String类型,不能传入对象,见API
2.通过setMaxAge()来设置Cookie的生命周期
cookie.setMaxAge(7*24*3600);//括号内表示Cookie的最大到期时间,
cookie.setMaxAge(-1));//当Web浏览器退出时将被删除。零值会导致cookie被删除。
3.设置cookie路径
cookie.setPath(String url);
4.发送 Cookie 到 HTTP 响应头:可以使用 response.addCookie来添加 HTTP 响应头中的 Cookies,如下所示:
response.addCookie(cookie);
在Servlet中获取Cookie
要读取 Cookies,您需要通过调用 HttpServletRequest 的 getCookies( ) 方法创建一个 javax.servlet.http.Cookie 对象的数组。然后循环遍历数组,并使用 getName() 和 getValue() 方法来访问每个 cookie 和关联的值。
Cookie[] cookies = null;
// 获取与该域相关的 Cookies 的数组
cookies = request.getCookies();
for(Cookie cookie : cookies){
//通过getName()和getValue()方法取出cookie的键和值
String name = cookie.getName();
String value = cookie.getValue();
}
删除Cookie
删除 Cookies 是非常简单的。如果您想删除一个 cookie,那么您只需要按照以下三个步骤进行:
- 读取一个现有的 cookie,并把它存储在 Cookie 对象中。
- 使用 setMaxAge() 方法设置 cookie 的年龄为零,来删除现有的 cookie。
- 把这个 cookie 添加到响应头。
//这里的cookie可以通过上述获取方法来获取,并根据getName()返回的值进行判断,当前获取的cookie是否为目标cookie
cookie.setMaxAge(0);
response.addCoookie(cookie);//必须带,相当于执行语句