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对象的所有方法:

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

 

转载于:https://www.cnblogs.com/chenloveslife/p/8988061.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值