Servlet之Cookie技术

前言:我们可以知道,由于Http的无状态性,也就是说当用户发送一次请求给服务器之后,服务器响应客户端的请求,当同一个客户端再次发送请求给服务器时,服务器并不知道这个请求是同一个客户端发送的。由此产生了Session追踪技术来保持状态,总共四个保持状态的方法:网址重写(URL传参),隐藏域(表单提交),cookie技术,session技术。今天来提一下第三种cookie技术。

一、cookie简介

  cookie是自动地在Web服务器和客户端之间传递的一小块信息,并存放在客户端所在的硬盘上,适用于需要跨越许多页面的信息,每个服务器最多可以支持20个cookie。

  由于cookie的传递是作为HTTP表头嵌入的,因此传输它的过程有HTTP协议处理,Servlet通过HttpServletRequest的getCookie()方法得到HTTP标头中cookies,通过HttpServletResponse的addCookie()方法返回带有cookie的HTTP标头保存在客户端。

二、cookie的用处

  cookie有个明显的缺点,就是数据是保存在客户端本地的,用户可以禁用或删除本地保存的cookie,并且安全性低。

  但是,我们可以利用cookie实现以下功能:

  能够跟踪特定访问者的访问次数、最后访问时间。

  能够提供给用户一定时间保存登陆的账号密码。

三、创建并存入cookie

1         Cookie cookie = new Cookie("testName","testValue");
2         cookie.setMaxAge(60*60);  //存活时间为一天
3         response.addCookie(cookie);

  调用javax.servlet.http.Cookie类,利用其构造方法(name,value)的键值对创建cookie对象。cookie对象的setMaxAge方法设定cookie存活的时间,当参数为-1时,表示cookie存放在浏览器缓存中,当浏览器关闭时消亡;当参数为0时,cookie从客户端删除;当为正值时,表示cookie的存活时间,单位为秒。这里谈一下其另外一个方法:getPath(),表示当前创建cookie的资源路径,如http://localhost:8080/FirstWebDemo/servlet/CookieDemo中写的cookie,那么path为/servlet/CookieDemo。为了将一个cookie发送给客户端,需要调用HttpServletResponse的addCookie方法将cookie保存在HTTP标头中响应给客户端。

  以下为cookie对象的所有方法:

类型 方法名 方法解释
String getComment() 返回cookie中注释,如果没有注释的话将返回空值.
String getDomain() 返回cookie中Cookie适用的域名. 使用getDomain() 方法可以指示浏览器把Cookie返回给同 一域内的其他服务器,而通常Cookie只返回给与发送它的服务器名字完全相同的服务器。注意域名必须以点开始(例如.yesky.com)
int getMaxAge() 返回Cookie过期之前的最大时间,以秒计算。
String getName() 返回Cookie的名字。名字和值是我们始终关心的两个部分,笔者会在后面详细介绍 getName/setName。
String getPath() 返回Cookie适用的路径。如果不指定路径,Cookie将返回给当前页面所在目录及其子目录下 的所有页面。
boolean getSecure() 如果浏览器通过安全协议发送cookies将返回true值,如果浏览器使用标准协议则返回false值。
String getValue() 返回Cookie的值。笔者也将在后面详细介绍getValue/setValue。
int getVersion() 返回Cookie所遵从的协议版本。
void setComment(String purpose) 设置cookie中注释。
void setDomain(String pattern) 设置cookie中Cookie适用的域名
void setMaxAge(int expiry) 以秒计算,设置Cookie过期时间。
void setPath(String uri) 指定Cookie适用的路径。
void setSecure(boolean flag) 指出浏览器使用的安全协议,例如HTTPS或SSL。
void setValue(String newValue) cookie创建后设置一个新的值。
void setVersion(int v) 设置Cookie所遵从的协议版本。   

四、读取客户端cookie

        Cookie[] cookies = request.getCookies();
        if (cookies != null) {
            for (Cookie c : cookies) {
                System.out.println(c.getName() + " " + c.getValue() + " " + c.getMaxAge());
            }
        }

  要访问客户端发出的cookie,可以使用HttpServletRequest的getCookies方法获取标头中的cookie,返回的是一个包含所有cookie的数组。

五、删除客户端的cookie

        Cookie[] cookies = request.getCookies();
        if (cookies != null) {
            for (Cookie c : cookies) {
                if (c.getName().equals("testName")) {  //删除cookie中Name值为testName的cookie
                    c.setMaxAge(0);   //设置存活时间为0
                    response.addCookie(c);  //覆盖原cookie,即为删除cookie
                }
            }
        }

  cookie对象没有提供直接删除cookie的方法,只能如上所示来删除cookie,除了 如上的方法,还可以新建一个与要删除cookie对象同名的cookie对象,再将其存活时间设置为0再返回给客户端。

六、注意事项:

  1. cookie的值不能为特殊符号,如空格,方括号,圆括号,等于号(=),逗号,双引号,斜杠,问号,@符号,冒号,分号。

  2. 见以下代码,这是我第一次学碰到的问题,直到我了解cookie的传递和工作过程后得以解决。

        Cookie cookie = new Cookie("testName","testValue");
        cookie.setMaxAge(60*60);
        response.addCookie(cookie);   //注意:这里是封装在HttpServletResponse里返回,必须得响应后再重新发送请求给web服务器,此时getCookie才能得到上一次创建并添加的cookie值,后面第一次是遍历不出此处添加的cookie值的。
        Cookie[] cookies = request.getCookies();
        if (cookies != null) {
            for (Cookie c : cookies) {
                System.out.println(c.getName() + " " + c.getValue() + " " + c.getMaxAge());  //没有输出值为testValue的cookie,这里我在不了解工作过程之前一直郁闷为什么不输出上文添加的cookie值。
            }
        }

 

猜你喜欢

转载自www.cnblogs.com/chenloveslife/p/8988061.html