前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Web阶段:第十六章:Cookie技术

Web阶段:第十六章:Cookie技术

作者头像
Java廖志伟
发布2022-09-28 11:08:16
发布2022-09-28 11:08:16
32500
代码可运行
举报
文章被收录于专栏:高级开发进阶高级开发进阶
运行总次数:0
代码可运行

Cookie技术 a)**什么是Cookie?** 1.Cookie翻译过来是饼干的意思。 2.Cookie是由服务器通知客户端,并由客户端保存键值对的一种技术。 它的构造器是:public Cookie(String name, String value) {} 3.只要客户端有Cookie,每次请求都会发送给服务器。 4.每个Cookie不能超过4kb的大小 b)如何创建Cookie 1、创建一个Cookie对象 2、调用response.addCookie( cookie );

代码语言:javascript
代码运行次数:0
运行
复制
protected void createCookie(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {		
//		1、创建一个Cookie对象
        Cookie cookie = new Cookie("key1", "value1");
        Cookie cookie2 = new Cookie("key2", "value2");
//		2、调用response.addCookie( cookie );
        response.addCookie(cookie);
        response.addCookie(cookie2);		
        response.getWriter().write("创建了Cookie");
}

c)服务器如何获取Cookie 只需要调用reqeust.getCookies():Cookie[] 图解如何获取Cookie。

代码语言:javascript
代码运行次数:0
运行
复制
protected void getCookie(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        // 获取客户端发送过来的全部的Cookie对象
        Cookie[] cookies = request.getCookies();
        if (cookies != null && cookies.length > 0) {
            for (Cookie cookie : cookies) {
                response.getWriter().write("收到客户端的Cookie:" + cookie.getName() + "====" + cookie.getValue() + "<br/>");
            }
        }
    }

工具类

代码语言:javascript
代码运行次数:0
运行
复制
public class CookieUtils {
    public static Cookie findCookie(String name,Cookie[] cookies) {
        if (name==null || cookies == null || cookies.length == 0) {
            return null;
        }
        for (Cookie cookie : cookies) {
            if (name.equals(cookie.getName())) {
                return cookie;
            }
        }
        return null;
    }	
}

d)Cookie值的修改

第一套方案是: 1、你要new一个同名的Cookie对象。 2、在构造器中传入你要修改的新值。 3、调用response.addCookie()

代码语言:javascript
代码运行次数:0
运行
复制
//		1、你要new一个同名的Cookie对象。
//		2、在构造器中传入你要修改的新值。
        Cookie cookie = new Cookie("key2", "newValue2");
//		3、调用response.addCookie()
        response.addCookie(cookie);

第二套方案是: 1、你需要先查找到你要修改的Cookie对象 2、然后调用setValue方法设置新的值 3、最后调用response.addCookie();

代码语言:javascript
代码运行次数:0
运行
复制
//		1、你需要先查找到你要修改的Cookie对象
        Cookie cookie = CookieUtils.findCookie("key1", request.getCookies());
        if (cookie != null) {
    //		2、然后调用setValue方法设置新的值
            cookie.setValue("newValue1");
    //		3、最后调用response.addCookie();
            response.addCookie(cookie);
        }

在谷歌浏览器中如何查看Cookie信息

在火狐 浏览器中如何查看 Cookie信息

e)Cookie生命控制 setMaxAge() 决定Cookie存活多久。 正数 在指定的秒数后过期。 零 表示马上删除Cookie 负数 表示浏览器关闭的时候,就删除Cookie(默认的情况)

代码语言:javascript
代码运行次数:0
运行
复制
protected void deleteNow(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        Cookie cookie = CookieUtils.findCookie("key2", request.getCookies());
        if (cookie != null) {
            cookie.setMaxAge(0);// 立即删除Cookie
            response.addCookie(cookie);
        }
        response.getWriter().write("key2这个Cookie没了");
    }
    
    protected void life3600(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        Cookie cookie = new Cookie("key2", "value3600");
        cookie.setMaxAge(60*60);//表示这个Cookie一个小时后被删除
        response.addCookie(cookie);
        response.getWriter().write("创建一个一小时后才会被删除的Cookie");
    }
    
    protected void defaultLife(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        // 创建出来的Cookie,maxAge默认值是-1,表示浏览器一关,Cookie就没了。
        Cookie cookie = new Cookie("key1", "value1");
        response.addCookie(cookie);
        response.getWriter().write("默认创建出来的Cookie,浏览器一关就没了");
    }

f)Cookie有效路径Path的设置 Cookie中有一个path属性,它可以有效的过滤哪些Cookie可以不用傻傻地发送给服务器。

当一个Cookie的path值为 /day14 表示请求地址是:http://ip:port/day14/* 那么Cookie就会发送给服务器

CookieA 的path=/day14 CookieB的path=/day14/abc

那么现在请求地址为:http://ip:port/day14/c.html CookieA会发送给服务器

如果请求的地址为:http://ip:port/day14/abc/c.html CookieA会发送给服务器 CookieB会发送给服务器

代码语言:javascript
代码运行次数:0
运行
复制
protected void pathTest(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {
    Cookie cookie = new Cookie("key3", "pathtest");
    cookie.setPath(request.getContextPath() + "/abc"); // 得到 /day14/abc
    response.addCookie(cookie);
    response.getWriter().write("我创建了一个有path的Cookie");
}

g)Cookie练习—免输入登录用户名

表单:

代码语言:javascript
代码运行次数:0
运行
复制
<body>
    <form action="userServlet">
        <input type="hidden" name="action" value="login"/>
        <!--用户名:<input type="text" name="username" value=" <%=request.getCookies()[0].getValue() %>"/>-->
        用户名:<input type="text" name="username" value="${ cookie.username.value }"/><br/>
        密码:<input type="password" name="password" /><br/>
        <input type="submit" />
    </form>
</body>

服务器Sevlet代码:

代码语言:javascript
代码运行次数:0
运行
复制
protected void login(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {
    String username = request.getParameter("username");
    String password = request.getParameter("password");
    
    if ("wzg168".equals(username) &amp;&amp; "123456".equals(password)) {
        // 登录成功
        Cookie cookie = new Cookie("username", username);
        cookie.setMaxAge(60*60*24*7);// 用户名保留 一个星期
        //如果二次的请求不同,页面可能不会显示,所以有时需要cookie .setPath("你保存在客户端cookie的路径");
        response.addCookie(cookie);
        System.out.println("下次再来,我记住你啦");
    } else {
        // 登录失败
        System.out.println("登录失败!");
    }
}

如果二次的请求不同,cookie中的域名不要设置localhost,会出现获取不到的情况

这里以userid为例子,http://order.gmall.com:8086的,设置userId到cookie中 主要代码就一行: //将userId保存到cookie中 CookieUtil.setCookie(request,response,“userId”,userLogin.getId(),606024,true);

http://list.gmall.com:8083的,获取cookie中的userId 主要代码就一行: //从cookie中获取userID String userId = CookieUtil.getCookieValue(request, “userId”, true);

工具类:

代码语言:javascript
代码运行次数:0
运行
复制
package com.javawxid.util;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;

/**
 * @param
 * @return
 */
public class CookieUtil {


    /***
     * 获得cookie中的值,默认为主ip:www.gmall.com
     * @param request
     * @param cookieName
     * @param isDecoder
     * @return
     */
    public static String getCookieValue(HttpServletRequest request, String cookieName, boolean isDecoder) {
        Cookie[] cookies = request.getCookies();
        if (cookies == null || cookieName == null){
            return null;
        }
        String retValue = null;
        try {
            for (int i = 0; i < cookies.length; i++) {
                if (cookies[i].getName().equals(cookieName)) {
                    if (isDecoder) {//如果涉及中文
                        retValue = URLDecoder.decode(cookies[i].getValue(), "UTF-8");
                    } else {
                        retValue = cookies[i].getValue();
                    }
                    break;
                }
            }
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return retValue;
    }


    /***
     * 设置cookie的值
     * @param request
     * @param response
     * @param cookieName
     * @param cookieValue
     * @param cookieMaxage
     * @param isEncode
     */
    public static   void setCookie(HttpServletRequest request, HttpServletResponse response, String cookieName, String cookieValue, int cookieMaxage, boolean isEncode) {
        try {
            if (cookieValue == null) {
                cookieValue = "";
            } else if (isEncode) {
                cookieValue = URLEncoder.encode(cookieValue, "utf-8");
            }
            Cookie cookie = new Cookie(cookieName, cookieValue);
            if (cookieMaxage >= 0)
                cookie.setMaxAge(cookieMaxage);
            if (null != request)// 设置域名的cookie
                cookie.setDomain(getDomainName(request));
            // 在域名的根路径下保存
            cookie.setPath("/");
            response.addCookie(cookie);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    /***
     * 获得cookie的主域名,本系统为gmall.com,保存时使用
     * @param request
     * @return
     */
    private static final String getDomainName(HttpServletRequest request) {
        String domainName = null;

        String serverName = request.getRequestURL().toString();
        if (serverName == null || serverName.equals("")) {
            domainName = "";
        } else {
            serverName = serverName.toLowerCase();
            serverName = serverName.substring(7);
            final int end = serverName.indexOf("/");
            serverName = serverName.substring(0, end);
            final String[] domains = serverName.split("\\.");
            int len = domains.length;
            if (len > 3) {
                // www.xxx.com.cn
                domainName = domains[len - 3] + "." + domains[len - 2] + "." + domains[len - 1];
            } else if (len <= 3 &amp;&amp; len > 1) {
                // xxx.com or xxx.cn
                domainName = domains[len - 2] + "." + domains[len - 1];
            } else {
                domainName = serverName;
            }
        }

        if (domainName != null &amp;&amp; domainName.indexOf(":") > 0) {
            String[] ary = domainName.split("\\:");
            domainName = ary[0];
        }
        System.out.println("domainName = " + domainName);
        return domainName;
    }

    /***
     * 将cookie中的内容按照key删除
     * @param request
     * @param response
     * @param cookieName
     */
    public static void deleteCookie(HttpServletRequest request, HttpServletResponse response, String cookieName) {
        setCookie(request, response, cookieName, null, 0, false);
    }


}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-04-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档