Java Web如何操作Cookie的添加修改和删除

本文详细介绍了Cookie的概念、创建、设置与读取方法,以及在Servlet中如何操作Cookie。讲解了Cookie的有效期、作用域、中文问题,并提供了添加、读取和删除Cookie的Java代码示例。
摘要由CSDN通过智能技术生成

一、Cookie是什么

Cookie是服务器存放在客户端浏览器上的一些小数据,可以使用Cookie完成与服务器的一些交互动作。服务器可以通过HTTP响应头将Cookie发送给浏览器,而浏览器如果支持存储Cookie,则将HTTP响应头信息中的Cookie内容存放到浏览器中。当浏览器请求访问一个网站时,如果这个网站在此浏览器中存放有Cookie内容,浏览器会将Cookie内容附加到HTTP请求头信息中发送给服务器。鉴于此,Cookie存放的内容是不宜过多的,一般浏览器也是这样规定的。

浏览器应该支持每台 Web 服务器有 20 个 cookie,总共有 300 个 cookie,并且可能将每个 cookie 的大小限定为 4 KB。

二、Servlet如何创建Cookie对象

Java Web提供了一个Cookie类:javax.servlet.http.Cookie

创建Cookie对象

Cookie是一个类似于键值对的数据,通过Cookie的构造方法Cookie(String name, String value)创建一个Cookie对象,不过Cookie与键值对数据不同的一点儿是,存储在浏览器中的Cookie对象可以拥有相同的name值,这点儿在后面获取Cookie对象的时候需要特别注意。

修改Cookie值

创建好Cookie对象后,我们可以通过setValue(String newValue)方法修改值,通过getValue()获取值。

添加Cookie描述

为了方便客户端用户查看Cookie信息,可以通过setComment(String purpose)方法设置一个描述信息,Cookie还没有发送前,通过getComment()方法获取描述信息。

设置Cookie有效期和删除Cookie

存放在客户端的Cookie是有有效期的,可以通过setMaxAge(int expiry)方法设置这个Cookie可以保存好长时间,单位为秒,这是一个时间长度,不是一个时间点Timestamp。如果没有设置有效期,则默认为-1(或者说小于0的值),表示在浏览器关闭时就删除Cookie内容,如果有效期设置为0,则表示通知浏览器立即删除这个Cookie。

设置Cookie作用范围和域

我们还可以指定Cookie在哪个网页才有效,通过setPath(String uri)方法即可设置,如果值为“/”表示作用范围为整个网站,默认是这个值。

另外还可以指定这个Cooke对其他网站有效(也就是不同的域),通过setDomain(String pattern)方法来实现,不过需要注意的是,一般浏览器是不允许一个网站设置另外网站的Cookie内容的,所以这个用处不大。实在要做,就需要修改浏览器的配置才行。

Cookie中文问题

Cookie有一点儿不好的就是不支持中文,这点儿一定要注意了,如果忘Cookie中添加了中文内容,则系统会抛出异常内容:

java.lang.IllegalArgumentException: Control character in cookie value, consider BASE64 encoding your value

如果确实需要写入中文,则需要进行BASE64转码才行。在读取Cookie的时候又需要进行反转码。

三、如何向客户端写入Cookie

前面说了,Cookie写入浏览器是通过HTTP响应头带入的。在Java Web开发中Response对象已经帮我们完成了这个工作,通过Response的addCookie(Cookie cookie)方法就可以向浏览器写入Cookie内容了。一个响应头可以带入多个Cookie,所以这个方法也可以多次调用,一次写入多个Cookie。

四、获取客户端发送来的Cookie

跟向浏览器写入Cookie相反,客户端通过HTTP请求头将Cookie带入发送给服务器。通过Request.getCookies()方法可以获取到从客户端发送来的Cookie数组。不过从浏览器发送过来的Cookie对象只有name属性和value属性,其他有效期,有效路径等都是没有的。而且可以有多个相同的name属性的,所以判断是不是我们需要的Cookie需要审慎的。

五、实现代码

添加Cookie:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        // 1.创建Cookie对象

        Cookie cookie1 = new Cookie("webname", "XCoder Studio");

        // 2.配置Cookie对象

        cookie1.setComment("Web Host Name");    // Cookie描述

        cookie1.setMaxAge(24*60*60);            // Cookie有效时间

        //cookie1.setPath("/");                 // Cookie有效路径


        // 3.通过response对象将Cookie写入浏览器,当然需要解决中文乱码问题,否则会抛出异常

        // java.lang.IllegalArgumentException: Control character in cookie value, consider BASE64 encoding your value

        response.setCharacterEncoding("UTF-8");

        response.setContentType("text/html;charset=UTF-8");

        response.addCookie(cookie1);


        // 跳转到首页

        response.sendRedirect("./index.jsp");

    }

 

读取Cookie:​​​​​​​

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    // 读取Cookie,通过request请求读取Cookie

    Cookie[] cookies = request.getCookies();


    // 判断是否存在Cookie,不存在跳转到首页

    if (cookies == null) {

        response.sendRedirect("./index.jsp");

        return;

    }


    // 处理输出中文乱码问题

    response.setCharacterEncoding("UTF-8");

    response.setContentType("text/html;charset=UTF-8");

    // 获取输出对象

    PrintWriter out = response.getWriter();

    // 迭代处理客户端发送来的Cookie对象


    for (Cookie cookie:cookies) {

        out.println("Cookie名   称:"+cookie.getName()+"<br />");

        out.println("Cookie储   值:"+cookie.getValue()+"<br />");

        out.println("Cookie备   注:"+cookie.getComment()+"<br />");

        out.println("Cookie有效时间:"+cookie.getMaxAge()+"<br />");

        out.println("Cookie有效路径:"+cookie.getPath()+"<br />");

        out.println("Cookie有效域名:"+cookie.getDomain()+"<br />");

        out.println("<a href=\"./CookieDel?name="+cookie.getName()+"\">删除Cookie</a><br />");

        out.println("---------------------------------------------------------<br />");

    }

}

 

删除Cookie:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    // 获取GET传递参数名称

    String delName = request.getParameter("name");

    if (delName == null) {

        response.sendRedirect("./CookieRead");

        return;

    }


    // 获取Cookies数组

    Cookie[] cookies = request.getCookies();

    // 迭代查找并清除Cookie

    for (Cookie cookie: cookies) {

        if (delName.equals(cookie.getName())) {

            cookie.setMaxAge(0);

            response.addCookie(cookie);

        }

    }


    response.setHeader("refresh", "3;./CookieRead");

    PrintWriter out = response.getWriter();

    out.println("Will go back after 3 seconds...");

}

运行会发现读取Cookie时,所以的有效时间都是Null的。

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值