Java는 사용자 브라우저 쿠키에서 어떻게 작동합니까?

1. 쿠키란 무엇입니까?

간단히 말하면, 클라이언트에 데이터를 저장하는 클라이언트 측 세션 기술(브라우저와 서버 간 다중 요청 및 응답) 입니다 .

2. 시행원리

응답 헤더 세트 쿠키 및 요청 헤더 쿠키를 기반으로 구현됨

1. 응답 헤더 세트 쿠키와 요청 헤더 쿠키는 무엇입니까

먼저, csdn 공식 홈페이지 패킷 캡처를 분석하여 응답 헤더 세트 쿠키와 요청 헤더 쿠키가         무엇인지 알아낼 수 있습니다 .

        1. 응답 헤더 세트-쿠키

        2. 헤더 쿠키 요청 

2. 그래픽 설명

        쿠키가 안녕하세요 메시지라고 가정합니다.

1. 첫 번째 요청

         클라이언트는 먼저 서버에 요청을 시작하고, 서버는 요청을 받습니다.서버는 귀하가 이전에 이곳에 가본 적이 없다는 것을 알고 쿠키 정보를 설정하고 응답합니다. 클라이언트는 서버의 응답을 수신하고 쿠키를 로컬에 저장합니다.

현재 서버 측 Java 코드는 다음과 같습니다. 

@WebServlet(name = "cookieDemo1", value = "/cookieDemo1")
public class 发送cookie extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Cookie cookie = new Cookie("msg","hello");       //创建cookie
        //将cookie存储到硬盘,30s后自动删除。负数为默认值,0为立马删除
        cookie.setMaxAge(30);   
        cookie.setPath("/");   //当前服务器下所有项目都共享cookie
        response.addCookie(cookie);       //发送cookie
    }

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

브라우저 응답 헤더 작업 효과를 확인합니다.

2. 두 번째 요청 

        클라이언트가 다시 서버에 요청을 하면 기존 쿠키 정보(로그인 정보)를 가져오는데, 이때 서버는 클라이언트가 이미 존재했다는 것을 알게 되므로 다시 쿠키 정보를 설정할 필요가 없습니다. 직접 액세스할 수 있습니다.

 현재 서버 측 Java 코드는 다음과 같습니다. 

@WebServlet(name = "cookieDemo2", value = "/cookieDemo2")
public class 获取cookie extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Cookie[] cookies = request.getCookies();                  //获取cookies
        if(cookies != null){
            for (Cookie cookie : cookies) {
                String name = cookie.getName();
                String value = cookie.getValue();
                System.out.println(name + ":" + value);
            }
        }
    }

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

 요청 헤더의 쿠키를 다시 확인하세요.

 3. 쿠키를 통해 이용자의 마지막 방문 시간을 알아냅니다.

1. 분석

서버의 서블릿은 lastTime이라는 쿠키가 있는지 확인합니다.

  • 예: 첫 방문이 아닙니다.

                1. 응답 데이터: 다시 오신 것을 환영합니다. 마지막 방문 시간은: 2018년 6월 10일 11:50:20
                2. 쿠키에 다시 쓰기: lastTime=2018년 6월 10일 11:50:01

  • 아니요: 이번이 첫 방문입니다.

                1. 응답 데이터: 안녕하세요, 첫 방문을 환영합니다.
                2. 답장 쿠키: lastTime=2018년 6월 10일 11:50:01

2. 코드 테스트 작성

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;

@WebServlet(name = "cookieDemo3", value = "/cookieDemo3")
public class 上次访问时间 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        Cookie[] cookies = request.getCookies();
        boolean flag = false;
        if(cookies != null && cookies.length > 0){
            for (Cookie cookie : cookies) {
                String name = cookie.getName();
                if(name.equals("lastTime")){
                    flag = true;
                    Date date = new Date();
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");     //获取中国时间
                    String last_Time = sdf.format(date);
                    last_Time = URLEncoder.encode(last_Time, "utf-8");      //对cookie值进行url编码,使其可以有空格输入
                    cookie.setValue(last_Time);                     //设置cookie值
                    cookie.setMaxAge(60*60*24*30);        //设置cookie存活时间为一个月
                    response.addCookie(cookie);                       //发送cookie
                    String value = cookie.getValue();                 //获取cookie值
                    value = URLDecoder.decode(value, "utf-8");            //对cookie值进行解码
                    response.getWriter().write("<h1>欢迎回来,您上次访问时间为:" + value + "</h1>");
                    break;
                }
            }
        }
        if(cookies == null || cookies.length == 0 || flag == false){
            Date date = new Date();
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");     //获取中国时间
            String last_Time = sdf.format(date);
            last_Time = URLEncoder.encode(last_Time, "utf-8");      //对cookie值进行url编码,使其可以有空格输入
            Cookie cookie = new Cookie("lastTime",last_Time);
            cookie.setMaxAge(60*60*24*30);               //设置cookie存活时间为一个月
            response.addCookie(cookie);                       //发送cookie
            response.getWriter().write("<h1>您好,欢迎您首次访问!</h1>");
        }
    }

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

3. 실행 결과 보기

  • 브라우저를 방문하면 이번이 첫 방문이라는 것을 알 수 있습니다.

  •  이때 응답 헤더의 쿠키 정보를 봅니다. 

  •  새로고침을 누르면 두 번째 방문하게 되는데 이때 마지막 로그인 시간이 표시됩니다. (정상적으로 표시하려면 UTF-8 인코딩으로 변환해야 합니다.)

  •  이때 이미 마지막 정보가 포함되어 있는 요청 헤더 쿠키를 확인하세요.

 4. 쿠키에 대한 약간의 지식

1. 한 번에 여러 쿠키를 보낼 수 있나요?

  • 할 수 있다
  • 여러 Cookie 개체를 만들고 응답을 사용하여 addCookie 메서드를 여러 번 호출하여 쿠키를 보낼 수 있습니다.

2. 쿠키는 브라우저에 얼마나 오래 저장되나요?

  • 기본적으로 쿠키 데이터는 브라우저를 닫으면 삭제됩니다.

3. 쿠키에 한자를 저장할 수 있나요?

  • Tomcat 8 이전에는 중국어 데이터를 쿠키에 직접 저장할 수 없었습니다.
  • 중국어 데이터를 트랜스코딩해야 합니다. 일반적으로 URL 인코딩(%E3)이 사용됩니다.
  •  Tomcat 8 이후에는 쿠키가 중국어 데이터를 지원합니다. 특수문자는 아직 지원되지 않으니, 저장을 위해서는 URL 인코딩을, 파싱을 위해서는 URL 디코딩을 사용하는 것이 좋습니다.

4. 여러 웹 프로젝트가 Tomcat 서버에 배포된다고 가정하면 이러한 웹 프로젝트 간에 쿠키를 공유할 수 있습니까?

  • 쿠키는 기본적으로 공유할 수 없습니다.
  • setPath(String path): 쿠키 획득 범위를 설정합니다. 기본적으로 현재 가상 디렉터리가 설정됩니다.
  • 공유하고 싶다면 경로를 "/"로 설정하시면 됩니다.

5. 서로 다른 Tomcat 서버 간의 쿠키 공유 문제가 있습니까?

  • setDomain(String path): 1차 도메인 이름을 동일하게 설정하면 여러 서버 간에 쿠키를 공유할 수 있습니다.
  • setDomain(".baidu.com"), Tieba.baidu.com 및 news.baidu.com의 쿠키를 공유할 수 있습니다.

5. 쿠키의 특성 및 기능

1.특징

  • 쿠키는 클라이언트 브라우저에 데이터를 저장합니다.
  • 브라우저에는 단일 쿠키의 크기(4kb)에 대한 제한과 동일한 도메인 이름 아래의 총 쿠키 수(20)에 대한 제한이 있습니다.

2. 기능 

  • 쿠키는 일반적으로 덜 민감한 소량의 데이터를 저장하는 데 사용됩니다.
  • 로그인 없이 서버의 클라이언트 식별을 완료하세요. 

Supongo que te gusta

Origin blog.csdn.net/weixin_51418964/article/details/123263187
Recomendado
Clasificación