웹 개발 (XI) 쿠키과 그 응용

개념의 1.Cookie

세션 1. 개념

일상 생활에서 전화 통화에서 당신이 날 그 하나의 세션 답변을 요청 물론 일련의 사이에 전화를 걸 수 있습니다.

세션 웹 응용 프로그램은 연속 클라이언트 (브라우저)와 웹 서버 사이에 발생하는 일련의를 의미, 과정이라는 삶과 유사 요청응답 웹 사이트에, 예를 들어, 공정 사용자를 전체 쇼핑 과정은 대화이다.

전화에서 양측은 클라이언트와 서버의 상호 작용의 과정에서 또한 대화를 이야기합니다, 일부 데이터를 생성 할 수 있습니다. 세션 동안 생성 된 데이터를 저장하기 위해 서블릿 기술, 두 데이터, 즉 쿠키 및 세션에 대한 세션 개체를.
여기에 그림 삽입 설명

개념의 2.Cookie

쿠키는 브라우저 측이다 세션 기술 . 그는입니다 서버를 생성 하고, 고객의 브라우저, 브라우저에 저장된 정보의 소량을 보낼 수 있습니다.

때 서버에 브라우저 액세스 다시 이전의 쿠키 정보를 전달합니다. (쿠키 정보를 저장), 서버는 쿠키, 당신은 어떤 브라우저 액세스를 알게됩니다 얻는다. (고객에게 특정)

4K와 같은 데이터 저장 쿠키 최대, 당신은 300 개 이상의 쿠키 일반 브라우저, 각 사이트 Xiacun 약 20 쿠키를 저장할 수 있습니다.

데이터가 로컬 스토리지에 저장 될 수있는 웹 프로젝트 : 3. 질문을 숙고?

  • 요청 도메인
  • ServletContext에 도메인 (웹 전체 프로젝트를 공유)
  • MySQL과 데이터베이스에 저장된 다른 데이터 (사용자가 로그인되어있는 경우, 당신은 도서관에 보관해야하며, 사용자가 기록되지 않습니다)
  • 그래서 IO 스토리지를 사용하여 TXT 파일 ...
왜에 저장되어있는 ServletContext를 요청하고 데이터를 사용하지?

여기에 그림 삽입 설명
질문 : 더 적절한 장바구니에 추가 데이터를 저장?

기술 세션 : 쿠키 브라우저 세션 및 세션 서버 기술에 대한 기술 세션.

2.Cookie의 원칙의 구현 (초점)

여기에 그림 삽입 설명
여기에 그림 삽입 설명

3.Cookie的API(重点)

1.问题1: Cookie如何创建 (Cookie理解为一个Map<String,String>)

Cookie(String name, String value)  服务器中创建Cookie

2.问题2:Cookie中可以存放什么数据?

只能存储字符串.并且是以键值对的方式存储.(类似于Properties集合)

3.问题3:Cookie如何发送到浏览器?

HttpServletResponse类中方法:
void addCookie(Cookie cookie)  把cookie添加到response中,响应的时候就将cookie带到了浏览器上

4.问题4:Cookie保存在浏览器的哪个位置?
여기에 그림 삽입 설명
5.问题5:服务器中如何获取Cookie?

HttpServletRequest类中有获取cookie的方法
Cookie[] getCookies()  request对象一次可以获取到所有的cookie信息.

6.Cookie对象的其他方法:

String getName()		获取cookie的key值
String getValue()		获取cookie的value值
void setMaxAge(int expiry)	设置cookie在浏览器的最大保存时间 单位是秒
void setPath(String uri)	设置路径,在哪个请求路径下会携带cookie.

setPath(“路径”),Path不一样的情况下,Cookie是可以重复的。当Path一样的情况下,Key值一样的,value就会被覆盖。

注意事项

  1. cookie的生存时间单位为:
  2. 要删除已经存在的cookie,后一个用来覆盖cookie必须名称与路径与原来的cookie一致

4.Cookie的入门案例

目标: 查看cookie的执行流程 (第一次请求没有,第一次响应服务器创建了cookie,浏览器保存cookie,第二次请求携带cookie,在服务器中可以获取到cookie信息)

需求: 创建一个Servlet,中创建一个Cookie,cookie保存信息name=tom , 当用户第二次访问的时候,将携带的cookie打印出来.
代码实现:
package com.ccc.cookie;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * 目标: 创建Cookie携带到浏览器 ,第二次请求该Servlet,获取cookie信息,打印里面的内容
 *
 * 观察流程:  1.第一次请求中不会携带cookie
 *           2.第一次响应,响应头中会把cookie携带到浏览器   查看响应头  查看浏览器的cookie
 *           3.第二次请求, 请求头中是否有cookie?  会!
 *           4.看控制台是否打印cookie的value值
 */
//@WebServlet(urlPatterns = "/Demo1_Cookie")
//@WebServlet(value = "/Demo1_Cookie")
@WebServlet("/Demo1_Cookie")
public class Demo1_Cookie extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        /**
         * 步骤
         * 1.设置编码
         * 2.创建Cookie  Cookie(String String)
         * 3.给response中	addCookie(Cookie)
         *
         * 用户第二次访问:
         * 4.获取cookie    request.getCookies();  Cookie[]
         * 5.遍历循环cookie[]  通过ke值找到我们自己设置的cookie   getName() 获取key
         * 6.通过cookie对象的getValue() 获取具体的值并打印.
         */
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=utf-8");
        Cookie cookie = new Cookie("name","jack");
        response.addCookie(cookie);

        //获取cookie
        Cookie[] cookies = request.getCookies();  //如果用户第一次过来,没有对象是null
        if(cookies !=null && cookies.length >0){
            for (Cookie c : cookies) {
                //如果cookie的key值为name , 找到了我们自己设置的cookie对象
                if("name".equals(c.getName())){
                    String value = c.getValue();
                    System.out.println(value);
                }
            }
        }
    }

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

5.Cookie默认在浏览器上的存储时间是多久?

浏览器默认保存会话的时间当会话结束,cookie就销毁 (浏览器只要关闭,cookie就消失).

观察完京东,每次添加完购物车之后,即便是关闭浏览器,再次打开,cookie有效,购物车中的数据也有效。为什么会这样呢?因为京东对cookie的保存时间进行了设置.

需求: 将浏览器的cookie信息保存一个礼拜
/**
 * 目标: 设置cookie在浏览器的最大保存时间为7天
 * Cookie对象的方法setMaxAge()
 */
@WebServlet("/Demo2_Cookie")
public class Demo2_Cookie extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=utf-8");
        Cookie cookie = new Cookie("name","jack");
        //设置cookie的最大保存时间 单位是秒
        cookie.setMaxAge(60*60*24*7);
        response.addCookie(cookie);

        //获取cookie
        Cookie[] cookies = request.getCookies();  //如果用户第一次过来,没有对象是null
        if(cookies !=null && cookies.length >0){
            for (Cookie c : cookies) {
                //如果cookie的key值为name , 找到了我们自己设置的cookie对象
                if("name".equals(c.getName())){
                    String value = c.getValue();
                    System.out.println(value);
                }
            }
        }
    }

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

6.设置请求携带cookie的路径

void setPath(String uri) 设置路径,在哪个请求路径下会携带cookie

模拟:项目day13 创建cookie设置cookie信息,第二次请求的时候只要访问路径:localhost:8080/day13/Demo1Servlet ,就可以携带cookie

项目day14创建cookie设置cookie信息,第二次请求的时候只要访问路径:localhost:8080/day14/Demo1Servlet ,就可以携带cookie

同一个项目如果设置了setPath, 那么在浏览器每次请求的时候,cookie只携带自己项目下的cookie,不会携带别的cookie.

案例演示: day13如果设置了setPath("/day13") ,那么浏览器请求他的时候只携带自己cookie,day14如果这时也设置了path,那么它每次也携带自己的path
Day13项目的
package com.ccc.cookie;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * 目标: 设置cookie在浏览器的最大保存时间为7天
 * Cookie对象的方法setMaxAge()
 */
@WebServlet("/Demo3_Cookie")
public class Demo3_Cookie extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=utf-8");
        Cookie cookie = new Cookie("name","jack");
        //设置cookie的最大保存时间 单位是秒
        cookie.setMaxAge(60*60*24*7);
        //设置path 请求路径中包含path 就会携带cookie
        cookie.setPath("/day13");
        response.addCookie(cookie);

        //获取cookie
        Cookie[] cookies = request.getCookies();  //如果用户第一次过来,没有对象是null
        if(cookies !=null && cookies.length >0){
            for (Cookie c : cookies) {
                //如果cookie的key值为name , 找到了我们自己设置的cookie对象
                if("name".equals(c.getName())){
                    String value = c.getValue();
                    System.out.println(value);
                }
            }
        }
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}
Day14项目的
package com.ccc.cookie;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * 目标: 设置cookie在浏览器的最大保存时间为7天
 * Cookie对象的方法setMaxAge()
 *
 */
@WebServlet("/Demo3_Cookie")
public class Demo3_Cookie extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=utf-8");
        Cookie cookie = new Cookie("name","rose");
        //设置cookie的最大保存时间 单位是秒
        cookie.setMaxAge(60*60*24*7);
        cookie.setPath("/day14");
        response.addCookie(cookie);

        //获取cookie
        Cookie[] cookies = request.getCookies();  //如果用户第一次过来,没有对象是null
        if(cookies !=null && cookies.length >0){
            for (Cookie c : cookies) {
                //如果cookie的key值为name , 找到了我们自己设置的cookie对象
                if("name".equals(c.getName())){
                    String value = c.getValue();
                    System.out.println(value);
                }
            }
        }
    }

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

7.Cookie 能够在程序中销毁(本质是被覆盖了)

实现步骤:

1.创建一个名称(key)一样的cookie,value值可以任意,建议使用空字符串

2.设置新创建的cookie的最大有效时间为0

3.设置新创建的cookie的path为本项目的

4.将新创建的cookie添加到response中,发送给浏览器(浏览器会自动的销毁)

需求:

目标是删除day14路径下的cookie (name=rose)的该cookie.

代码实现

/**

 需求:
 目标是删除day14路径下的cookie (name=rose)的该cookie.

 */
@WebServlet("/Demo4_DeleteCookie")
public class Demo4_DeleteCookie extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        /**
         实现步骤:
         1.创建一个名称(key)一样的cookie,value值可以任意,建议使用空字符串
         2.设置新创建的cookie的最大有效时间为0
         3.设置新创建的cookie的path为本项目的
         4.将新创建的cookie添加到response中,发送给浏览器(浏览器会自动的销毁)
         */
        Cookie cookie = new Cookie("name","");
        cookie.setMaxAge(0);
        cookie.setPath("/day14");
        response.addCookie(cookie);
        System.out.println("day14的cookie的name为rose的cookie已经删除完毕");
    }

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

8.案例- 记录上一次访问的时间 (重点)

요구 사항 :. 사용자가 처음 방문 CookieServlet 인 경우, 브라우저가 당신의 마지막 방문이 XXXX에 있던 인쇄 제공, 사용자가 첫 번째 방문이 아닌 경우 브라우저가 처음 방문 인쇄
주소 : HTTPS : / /blog.csdn.net/qq_45083975/article/details/92965972

추천

출처blog.csdn.net/qq_45083975/article/details/92854973