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