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

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

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 );

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。

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/>");
      }
    }
  }

工具类

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()

//    1、你要new一个同名的Cookie对象。
//    2、在构造器中传入你要修改的新值。
    Cookie cookie = new Cookie("key2", "newValue2");
//    3、调用response.addCookie()
    response.addCookie(cookie);

第二套方案是:

1、你需要先查找到你要修改的Cookie对象

2、然后调用setValue方法设置新的值

3、最后调用response.addCookie();

//    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(默认的情况)

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会发送给服务器

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练习—免输入登录用户名

表单:

<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代码:

protected void login(HttpServletRequest request,
    HttpServletResponse response) throws ServletException, IOException {
  String username = request.getParameter("username");
  String password = request.getParameter("password");
  if ("wzg168".equals(username) && "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);

工具类:

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 && len > 1) {
                // xxx.com or xxx.cn
                domainName = domains[len - 2] + "." + domains[len - 1];
            } else {
                domainName = serverName;
            }
        }
        if (domainName != null && 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);
    }
}
相关文章
|
6月前
|
安全 Java API
Java Web 在线商城项目最新技术实操指南帮助开发者高效完成商城项目开发
本项目基于Spring Boot 3.2与Vue 3构建现代化在线商城,涵盖技术选型、核心功能实现、安全控制与容器化部署,助开发者掌握最新Java Web全栈开发实践。
646 1
|
9月前
|
缓存 前端开发 应用服务中间件
Web端实时通信技术SSE在携程机票业务中的实践应用
本文介绍了携程机票前端基于Server-Sent Events(SSE)实现服务端推送的企业级全链路通用技术解决方案。文章深入探讨了 SSE 技术在应用过程中包括方案对比、技术选型、链路层优化以及实际效果等多维度的技术细节,为类似使用场景提供普适性参考和借鉴。该方案设计目标是实现通用性,适用于各种网络架构和业务场景。
297 1
|
10月前
|
缓存 前端开发 应用服务中间件
Web端实时通信技术SSE在携程机票业务中的实践应用
本文介绍了携程机票前端基于Server-Sent Events(SSE)实现服务端推送的企业级全链路通用技术解决方案。文章深入探讨了 SSE 技术在应用过程中包括方案对比、技术选型、链路层优化以及实际效果等多维度的技术细节,为类似使用场景提供普适性参考和借鉴。
390 7
|
人工智能 安全 物联网
区块链技术的未来展望:去中心化金融(DeFi)与Web 3.0的融合
区块链技术的未来展望:去中心化金融(DeFi)与Web 3.0的融合
|
前端开发 JavaScript 搜索推荐
HTML与CSS在Web组件化中的核心作用及前端技术趋势
本文探讨了HTML与CSS在Web组件化中的核心作用及前端技术趋势。从结构定义、语义化到样式封装与布局控制,两者不仅提升了代码复用率和可维护性,还通过响应式设计、动态样式等技术增强了用户体验。面对兼容性、代码复杂度等挑战,文章提出了相应的解决策略,强调了持续创新的重要性,旨在构建高效、灵活的Web应用。
369 6
|
XML 前端开发 JavaScript
PHP与Ajax在Web开发中的交互技术。PHP作为服务器端脚本语言,处理数据和业务逻辑
本文深入探讨了PHP与Ajax在Web开发中的交互技术。PHP作为服务器端脚本语言,处理数据和业务逻辑;Ajax则通过异步请求实现页面无刷新更新。文中详细介绍了两者的工作原理、数据传输格式选择、具体实现方法及实际应用案例,如实时数据更新、表单验证与提交、动态加载内容等。同时,针对跨域问题、数据安全与性能优化提出了建议。总结指出,PHP与Ajax的结合能显著提升Web应用的效率和用户体验。
352 3
|
存储 安全 搜索推荐
理解Session和Cookie:Java Web开发中的用户状态管理
理解Session和Cookie:Java Web开发中的用户状态管理
308 4
|
SQL 负载均衡 安全
安全至上:Web应用防火墙技术深度剖析与实战
【10月更文挑战第29天】在数字化时代,Web应用防火墙(WAF)成为保护Web应用免受攻击的关键技术。本文深入解析WAF的工作原理和核心组件,如Envoy和Coraza,并提供实战指南,涵盖动态加载规则、集成威胁情报、高可用性配置等内容,帮助开发者和安全专家构建更安全的Web环境。
481 1
|
负载均衡 监控 算法
论负载均衡技术在Web系统中的应用
【11月更文挑战第4天】在当今高并发的互联网环境中,负载均衡技术已经成为提升Web系统性能不可或缺的一环。通过有效地将请求分发到多个服务器上,负载均衡不仅能够提高系统的响应速度和处理能力,还能增强系统的可扩展性和稳定性。本文将结合我参与的一个实际软件项目,从项目概述、负载均衡算法原理以及实际应用三个方面,深入探讨负载均衡技术在Web系统中的应用。
427 2
|
缓存 安全 前端开发
构建高效Web应用的五大关键技术
【10月更文挑战第42天】在数字化浪潮中,Web应用已成为企业与用户互动的重要桥梁。本文将深入探讨提升Web应用性能和用户体验的五项核心技术,包括前端优化、后端架构设计、数据库管理、安全性增强以及API开发的最佳实践。通过这些技术的应用,开发者可以构建出更快、更稳定且更安全的Web应用,满足现代网络环境的需求。