서블릿 쿠키 처리


쿠키는 고객의 컴퓨터에 저장되며 다양한 추적 정보를 유지하는 텍스트 파일입니다. Java 서블릿은 분명히 HTTP 쿠키를 지원합니다.

재방문 사용자를 식별하려면 다음 세 단계가 필요합니다.

  • 서버 스크립트는 쿠키 세트를 브라우저로 보냅니다. 예: 이름, 나이, 주민등록번호 등

  • 브라우저는 나중에 사용할 수 있도록 이 정보를 컴퓨터에 로컬로 저장합니다.

  • 다음번에 브라우저가 웹 서버에 요청을 보낼 때 브라우저는 이러한 쿠키 정보를 서버로 보내고 서버는 이 정보를 사용하여 사용자를 식별합니다.

이 장에서는 쿠키를 설정 또는 재설정하는 방법, 쿠키에 액세스하는 방법 및 삭제하는 방법에 대해 설명합니다.

쿠키 분석

쿠키는 일반적으로 HTTP 헤더에 설정됩니다(JavaScript는 브라우저에서 직접 쿠키를 설정할 수도 있음). 쿠키를 설정하는 서블릿은 다음 헤더 정보를 보냅니다.

HTTP/1.1 200 OK
Date: Fri, 04 Feb 2000 21:03:38 GMT
Server: Apache/1.3.9 (UNIX) PHP/4.0b3
Set-Cookie: name=xyz; expires=Friday, 04-Feb-07 22:03:38 GMT; 
                 path=/; domain=w3cschool.cc
Connection: close
Content-Type: text/html

보시다시피 Set-Cookie 헤더에는 이름-값 쌍, GMT 날짜, 경로 및 도메인이 포함되어 있습니다. 이름과 값은 URL로 인코딩됩니다. 만료 필드는 주어진 시간과 날짜가 지나면 쿠키를 "삭제"하도록 브라우저에 지시하는 명령입니다.

귀하의 브라우저가 쿠키를 저장하도록 구성된 경우 해당 정보는 만료일까지 유지됩니다. 사용자의 브라우저가 쿠키의 경로 및 도메인과 일치하는 페이지를 가리키면 쿠키를 서버로 다시 보냅니다. 브라우저의 헤더 정보는 다음과 같습니다.

GET / HTTP/1.0
Connection: Keep-Alive
User-Agent: Mozilla/4.6 (X11; I; Linux 2.2.6-15apmac ppc)
Host: zink.demon.co.uk:1126
Accept: image/gif, */*
Accept-Encoding: gzip
Accept-Language: en
Accept-Charset: iso-8859-1,*,utf-8
Cookie: name=xyz

서블릿은 request.getCookies() 요청 메서드를 통해 쿠키에 액세스할 수 있으며, 이 메서드는 쿠키를 반환합니다. 객체 배열.

서블릿 쿠키 메소드

다음은 서블릿에서 쿠키를 조작할 때 사용할 수 있는 유용한 메소드 목록입니다.

序号方法 & 描述
1public void setDomain(String pattern)
该方法设置 cookie 适用的域,例如 w3cschool.cc。
2public String getDomain()
该方法获取 cookie 适用的域,例如 w3cschool.cc。
3public void setMaxAge(int expiry)
该方法设置 cookie 过期的时间(以秒为单位)。如果不这样设置,cookie 只会在当前 session 会话中持续有效。
4public int getMaxAge()
该方法返回 cookie 的最大生存周期(以秒为单位),默认情况下,-1 表示 cookie 将持续下去,直到浏览器关闭。
5public String getName()
该方法返回 cookie 的名称。名称在创建后不能改变。
6public void setValue(String newValue)
该方法设置与 cookie 关联的值。
7public String getValue()
该方法获取与 cookie 关联的值。
8public void setPath(String uri)
该方法设置 cookie 适用的路径。如果您不指定路径,与当前页面相同目录下的(包括子目录下的)所有 URL 都会返回 cookie。
9public String getPath()
该方法获取 cookie 适用的路径。
10public void setSecure(boolean flag)
该方法设置布尔值,表示 cookie 是否应该只在加密的(即 SSL)连接上发送。
11public void setComment(String purpose)
该方法规定了描述 cookie 目的的注释。该注释在浏览器向用户呈现 cookie 时非常有用。
12public String getComment()
该方法返回了描述 cookie 目的的注释,如果 cookie 没有注释则返回 null。

서블릿을 통해 쿠키 설정

서블릿을 통해 쿠키 설정에는 세 단계가 포함됩니다.

(1) 쿠키 객체 생성: 쿠키 생성자를 사용하여 호출할 수 있습니다. 쿠키 이름과 쿠키 값이 있는 경우 쿠키 이름과 쿠키 값은 모두 문자열입니다.

Cookie cookie = new Cookie("key","value");

이름이나 값에는 공백이나 다음 문자가 포함되어서는 안 됩니다.

[ ] ( ) = , " / ? @ : ;

(2) 최대 수명 설정: setMaxAge를 사용할 수 있습니다. 쿠키가 유효한 기간(초)을 지정하는 메서드입니다. 다음은 최대 유효 기간이 24시간인 쿠키를 설정합니다.

cookie.setMaxAge(60*60*24);

(3) HTTP 응답 헤더에 쿠키 보내기: 아래와 같이 response.addCookie를 사용하여 HTTP 응답 헤더에 쿠키를 추가할 수 있습니다.

response.addCookie(cookie);

이름과성에 대한 쿠키를 설정하도록 양식 데이터 인스턴스를 수정해 보겠습니다.

// 导入必需的 java 库
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
 
// 扩展 HttpServlet 类
public class HelloForm extends HttpServlet {
 
  public void doGet(HttpServletRequest request,
                    HttpServletResponse response)
            throws ServletException, IOException
  {
      // 为名字和姓氏创建 Cookies      
      Cookie firstName = new Cookie("first_name",
                      request.getParameter("first_name"));
      Cookie lastName = new Cookie("last_name",
                      request.getParameter("last_name"));

      // 为两个 Cookies 设置过期日期为 24 小时后
      firstName.setMaxAge(60*60*24); 
      lastName.setMaxAge(60*60*24); 

      // 在响应头中添加两个 Cookies
      response.addCookie( firstName );
      response.addCookie( lastName );

      // 设置响应内容类型
      response.setContentType("text/html;charset=UTF-8");
 
      PrintWriter out = response.getWriter();
      String title = "设置 Cookies 实例";
      String docType =
      "<!doctype html public \"-//w3c//dtd html 4.0 " +
      "transitional//en\">\n";
      out.println(docType +
                "<html>\n" +
                "<head><title>" + title + "</title></head>\n" +
                "<body bgcolor=\"#f0f0f0\">\n" +
                "<h1 align=\"center\">" + title + "</h1>\n" +
                "<ul>\n" +
                "  <li><b>名字</b>:"
                + request.getParameter("first_name") + "\n</li>" +
                "  <li><b>姓氏</b>:"
                + request.getParameter("last_name") + "\n</li>" +
                "</ul>\n" +
                "</body></html>");
  }
}

위 서블릿 HelloForm을 컴파일하고 web.xml 파일에 적절한 항목을 생성한 후 마지막으로 다음 HTML 페이지를 사용하여 서블릿을 호출해 보세요.

 <html>
<head>
<meta charset="utf-8">
<title>php中文网(php.cn)</title>
</head>
<body>
<form action="HelloForm" method="GET">
名字:<input type="text" name="first_name">
<br />
姓氏:<input type="text" name="last_name" />
<input type="submit" value="提交" />
</form>
</body>
</html>

위의 HTML 콘텐츠를 hello.htm 파일에 저장하고 <Tomcat-installation-directory>/webapps/ROOT 디렉토리에 저장합니다. http://localhost:8080/Hello.htm을 방문하면 위 양식의 실제 출력은 다음과 같습니다.

이름과 성을 입력해 보세요. 을 클릭한 후 "제출" 버튼을 클릭하면 이름과 성이 화면에 표시되고 다음에 제출 버튼을 누르면 두 개의 쿠키인 firstName과 lastName이 설정됩니다. 서버.

다음 섹션에서는 웹 애플리케이션에서 이러한 쿠키에 액세스하는 방법을 설명합니다.

서블릿을 통해 쿠키 읽기

쿠키를 읽으려면 HttpServletRequestgetCookies( ) 메소드를 호출하여 javax를 생성해야 합니다. .servlet.http.Cookie 객체의 배열. 그런 다음 배열을 반복하고 getName() 및 getValue() 메서드를 사용하여 각 쿠키 및 관련 값에 액세스합니다.

인스턴스

위 인스턴스에 설정된 쿠키를 읽어보겠습니다

// 导入必需的 java 库
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
 
// 扩展 HttpServlet 类
public class ReadCookies extends HttpServlet {
 
  public void doGet(HttpServletRequest request,
                    HttpServletResponse response)
            throws ServletException, IOException
  {
      Cookie cookie = null;
	  Cookie[] cookies = null;
      // 获取与该域相关的 Cookies 的数组
      cookies = request.getCookies();
      
      // 设置响应内容类型
      response.setContentType("text/html;charset=UTF-8");
 
      PrintWriter out = response.getWriter();
      String title = "Reading Cookies Example";
      String docType =
      "<!doctype html public \"-//w3c//dtd html 4.0 " +
      "transitional//en\">\n";
      out.println(docType +
                "<html>\n" +
                "<head><title>" + title + "</title></head>\n" +
                "<body bgcolor=\"#f0f0f0\">\n" );
      if( cookies != null ){
         out.println("<h2>查找 Cookies 名称和值</h2>");
         for (int i = 0; i < cookies.length; i++){
            cookie = cookies[i];
            out.print("名称:" + cookie.getName( ) + ",");
            out.print("值:" + cookie.getValue( )+" <br/>");
         }
      }else{
          out.println("<h2>未找到 Cookies</h2>");
      }
      out.println("</body>");
      out.println("</html>");
   }
}

위 서블릿 ReadCookies를 컴파일하고 web.xml 파일에 적절한 생성 항목. first_name 쿠키를 "John"으로 설정하고 last_name 쿠키를 "Player"로 설정하고 http://localhost:8080/ReadCookies를 실행하려고 하면 다음 결과가 표시됩니다.

< 테이블 클래스=" src" 스타일="배경색: #f7f7f7;경계: 1px 단색 #d6d6d6;경계 축소: 붕괴;폭: 100%;">

查找 Cookies 名称和值

名称:first_name,值:John
名称:last_name,值:Player
쿠키 이름 및 값 찾기 <🎜>이름: first_name, 값: John <🎜>이름: last_name, 값: Player

서블릿을 통한 쿠키 삭제

쿠키 삭제는 매우 간단합니다. 쿠키를 삭제하려면 다음 세 단계를 따르기만 하면 됩니다.

  • 기존 쿠키를 읽고 쿠키 개체에 저장합니다.

  • setMaxAge() 메소드를 사용하여 쿠키의 수명을 0으로 설정하여 기존 쿠키를 삭제합니다.

  • 이 쿠키를 응답 헤더에 추가하세요.

예제

다음 예에서는 "first_name"이라는 기존 쿠키를 삭제하고, 다음에 ReadCookies Servlet을 실행하면 first_name을 NULL 값으로 반환합니다.

// 导入必需的 java 库
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
 
// 扩展 HttpServlet 类
public class DeleteCookies extends HttpServlet {
 
  public void doGet(HttpServletRequest request,
                    HttpServletResponse response)
            throws ServletException, IOException
  {
      Cookie cookie = null;
	  Cookie[] cookies = null;
      // 获取与该域相关的 Cookies 的数组
      cookies = request.getCookies();
      
	  // 设置响应内容类型
      response.setContentType("text/html;charset=UTF-8");
 
      PrintWriter out = response.getWriter();
      String title = "Delete Cookies Example";
      String docType =
      "<!doctype html public \"-//w3c//dtd html 4.0 " +
      "transitional//en\">\n";
      out.println(docType +
                "<html>\n" +
                "<head><title>" + title + "</title></head>\n" +
                "<body bgcolor=\"#f0f0f0\">\n" );
       if( cookies != null ){
         out.println("<h2>Cookies 名称和值</h2>");
         for (int i = 0; i < cookies.length; i++){
            cookie = cookies[i];
            if((cookie.getName( )).compareTo("first_name") == 0 ){
                 cookie.setMaxAge(0);
                 response.addCookie(cookie);
                 out.print("已删除的 cookie:" + 
                              cookie.getName( ) + "<br/>");
            }
            out.print("名称:" + cookie.getName( ) + ",");
            out.print("值:" + cookie.getValue( )+" <br/>");
         }
      }else{
          out.println(
            "<h2 class="tutheader">No cookies founds</h2>");
      }
      out.println("</body>");
      out.println("</html>");
   }
}

위 서블릿 DeleteCookies를 컴파일하고 web.xml 파일에 적절한 항목을 만듭니다. 이제 http://localhost:8080/DeleteCookies를 실행하면 다음 결과가 표시됩니다.

Cookies 名称和值

已删除的 cookie:first_name
名称:first_name,值:John
名称:last_name,值:Player
쿠키 이름 및 값

삭제된 쿠키: first_name이름: first_name, 값: John이름: last_name, 값: Player

이제

查找 Cookies 名称和值

名称:last_name,值:Player
http://localhost:8080/ReadCookies

를 실행해 보세요. , 다음과 같은 쿠키만 표시합니다:

쿠키 이름 및 값 찾기<🎜>이름: last_name, 값: Player
<🎜 >Internet Explorer에서는 쿠키를 수동으로 삭제할 수 있습니다. "도구" 메뉴에서 "인터넷 옵션"을 선택합니다. 모든 쿠키를 삭제하려면 "쿠키 삭제"를 클릭하세요. <🎜><🎜>