Servlet Cookie对象详解

Cookie是服务器发送给浏览器的体积很小的纯文本信息,用户以后访问同一个Web服务器时浏览器会把它们原样发送给服务器。cookie一般用于在线交易过程中标识用户身份、安全要求不高的场合避免用户重复输入名字和密码、门户网站的主页定制、有针对性地投放广告等等。 Servlet中可以同时创建多个cookie,但是每个站点最多只能保存20个cookie。

原理

Servlet Cookie原理

1. 服务器脚本向浏览器发送一组 Cookies。例如:姓名、年龄或识别号码等。
2. 浏览器将这些信息存储在本地计算机上,以备将来使用。
3. 当下一次浏览器向 Web 服务器发送任何请求时,浏览器会把这些 Cookies 信息发送到服务器,服务器将使用这些信息来识别用户。

Servlet Cookie方法

序号 方法 & 描述
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");

无论是名字还是值,都不应该包含空格或以下任何字符:[ ] ( ) = , " / ? @ : ;

2. 设置最大生存周期

cookie.setMaxAge(60*60*24);  //设置一个最长有效期为 24 小时的 cookie。

3. 保存Cookie

response.addCookie(cookie);

使用response.addCookie来添加HTTP响应头中的Cookies,保存到客户端。

读取删除Cookie

1. 通过Servlet读取Cookies

要读取 Cookies,您需要通过调用 HttpServletRequest 的 getCookies( ) 方法创建一个 javax.servlet.http.Cookie 对象的数组。然后循环遍历数组,并使用 getName() 和 getValue() 方法来访问每个 cookie 和关联的值。

2. 通过Servlet删除Cookies

a. 读取一个现有的 cookie,并把它存储在 Cookie 对象中。
b. 使用 setMaxAge() 方法设置 cookie 的年龄为零,来删除现有的 cookie。
c. 把这个 cookie 添加到响应头。

例子

//创建cookie
public void doGet(HttpServletRequest req, HttpServletResponse res) {
    try {
        res.setContentType("text/html;charset=gbk");
        PrintWriter pw = res.getWriter();
        //当用户访问该servlet时, 就将信息创建到该用户的cookie中  
        //1. 现在服务器端创建一个cookie  
        Cookie myCookie = new Cookie("color1", "red");

        //2. 该cookie存在的时间 以秒为单位  
        myCookie.setMaxAge(30000);
        //如果你不设置存在时间,那么该cookie将不会保存  
        //3. 将该cookie写回到客户端  
        res.addCookie(myCookie);

        pw.println("已经创建了cookie");
    } catch(Exception ex) {

        ex.printStackTrace();
    }
}
//读取cookie
public void doGet(HttpServletRequest req, HttpServletResponse res) {
    try {
        res.setContentType("text/html;charset=gbk");
        PrintWriter pw = res.getWriter();
        //从客户端得到所有cookie信息  
        Cookie[] allCookies = req.getCookies();
        int i = 0;
        //如果allCookies不为空...  
        if (allCookies != null) {
            //从中取出cookie  
            for (i = 0; i < allCookies.length; i++) {
                //依次取出  
                Cookie temp = allCookies[i];
                if (temp.getName().equals("color1")) {
                    //得到cookie的值  
                    String val = temp.getValue();
                    pw.println("color1=" + val);
                    break;
                }
            }
            if (allCookies.length == i) {
                pw.println("cookie 过期");
            }
        } else {
            pw.println("不存在color1这个cookie/或是过期了!");
        }
    } catch(Exception ex) {
        ex.printStackTrace();
    }
}
//删除cookie
public void doGet(HttpServletRequest req, HttpServletResponse res) {
    try {
        res.setContentType("text/html;charset=gbk");
        PrintWriter pw = res.getWriter();
        //从客户端得到所有cookie信息  
        Cookie[] allCookies = req.getCookies();
        int i = 0;
        //如果allCookies不为空...  
        if (allCookies != null) {
            //从中取出cookie  
            for (i = 0; i < allCookies.length; i++) {
                //依次取出  
                Cookie temp = allCookies[i];
                if (temp.getName().equals("color")) {
                    //将该cookie删除  
                    temp.setMaxAge(0);
                    pw.println("删除了color这个cookie");
                    break;
                }
            }
        }
    } catch(Exception ex) {
        ex.printStackTrace();
    }
}

总结

1. Cookie的目的就是为用户带来方便,为网站带来增值。虽然有着许多误传,事实上Cookie并不会造成严重的安全威胁。Cookie永远不会以任何方式执行,因此也不会带来病毒或攻击你的系统。另外,由于浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4 KB,因此Cookie不会塞满你的硬盘,更不会被用作“拒绝服务”攻击手段。 

2. Cookie是由服务器创建,然后通过响应发送给客户端的一个键值对。客户端会保存Cookie,并会标注出Cookie的来源(哪个服务器的Cookie)。当客户端向服务器发出请求时会把所有这个服务器Cookie包含在请求中发送给服务器,这样服务器就可以识别客户端了。

3. Servlet先要调用new Cookie(name,value)用合适的名字和值创建一个或多个Cookie,通过cookie.setXXX设置各种属性,通过response.addCookie(cookie)把cookie加入应答头。 
4. Servlet从客户端读入Cookie,应该调用request.getCookies(),getCookies()方法返回一个Cookie对象的数组。在大多数情况下,你只需要用循环访问该数组的各个元素寻找指定名字的Cookie,然后对该Cookie调用getValue方法取得与指定名字关联的值。

版权声明:本文为JAVASCHOOL原创文章,未经本站允许不得转载。