Latest web development tutorials

서블릿 쿠키 처리

쿠키가 클라이언트 시스템에 저장되어있는 텍스트 파일, 및 추적 정보의 다양성을 유지한다. 자바 서블릿은 명확하게 HTTP 쿠키를 지원합니다.

사용자 식별은 세 단계를 포함 반환

  • 서버 스크립트는 브라우저에 쿠키를 전송합니다. 예를 들어 이름, 나이 또는 식별 번호.
  • 브라우저는 나중에 사용하기 위해 로컬 컴퓨터에서이 정보를 저장합니다.
  • 브라우저를 다른 웹 서버로 요청을 전송 다음번, 브라우저는 서버가 사용자를 식별하기 위해이 정보를 사용하여, 서버 쿠키 정보를 전송한다.

이 장에서는 어떻게 설정하거나 액세스하는 방법과이를 제거하는 방법 쿠키를 다시 알려줍니다.

중국어 인코딩 및 디코딩의 요구를 처리하는 서블릿 쿠키, 다음과 같이 :

String   str   =   java.net.URLEncoder.encode("中文");            //编码
String   str   =   java.net.URLDecoder.decode("编码后的字符串");   // 解码

쿠키 분석

(자바 스크립트는 또한 브라우저 쿠키에 직접 설정 될 수있다) 쿠키는 보통 HTTP 헤더 정보에 설정된다. 서블릿 쿠키를 설정하면 다음 헤더를 보낼 것입니다 :

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

당신이 볼 수 있듯이, 설정-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.getCookes ()를 ()에의해 액세스 할 수 있습니다.

서블릿 쿠키 방법

서블릿 쿠키에서 작동하는 것은 사용할 수있는 경우 다음은 유용한 방법의 목록입니다.

序号方法 & 描述
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 응답 헤더를 보내 : 당신은 HTTP 응답 헤더에 쿠키를 추가 할 response.addCookie를사용하여 다음과 같이

response.addCookie(cookie);

의 우리 수정할 수 폼 데이터 인스턴스를 성과 이름의 쿠키를 설정합니다.

package com.w3big.test;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLEncoder;

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;

/**
 * Servlet implementation class HelloServlet
 */
@WebServlet("/HelloForm")
public class HelloForm extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public HelloForm() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		// 为名字和姓氏创建 Cookie      
		Cookie name = new Cookie("name",
				URLEncoder.encode(request.getParameter("name"), "UTF-8")); // 中文转码
		Cookie url = new Cookie("url",
		              request.getParameter("url"));
		
		// 为两个 Cookie 设置过期日期为 24 小时后
		name.setMaxAge(60*60*24); 
		url.setMaxAge(60*60*24); 
		
		// 在响应头中添加两个 Cookie
		response.addCookie( name );
		response.addCookie( url );
		
		// 设置响应内容类型
		response.setContentType("text/html;charset=UTF-8");
		
		PrintWriter out = response.getWriter();
		String title = "设置 Cookie 实例";
		String docType = "<!DOCTYPE html>\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("name") + "\n</li>" +
		        "  <li><b>站点 URL:</b>:"
		        + request.getParameter("url") + "\n</li>" +
		        "</ul>\n" +
		        "</body></html>");
		}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

이전서블릿 HelloForm를 컴파일하고 web.xml 파일에서 적절한 항목을 작성 :

<?xml version="1.0" encoding="UTF-8"?>
<web-app>
  <servlet> 
    <!-- 类名 -->  
    <servlet-name>HelloForm</servlet-name>
    <!-- 所在的包 -->
    <servlet-class>com.w3big.test.HelloForm</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>HelloForm</servlet-name>
    <!-- 访问的网址 -->
    <url-pattern>/TomcatTest/HelloForm</url-pattern>
  </servlet-mapping>
</web-app>
마지막 시도는 다음과 같은 HTML 페이지 서블릿을 호출합니다.

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>本教程(w3big.com)</title>
</head>
<body>
<form action=/TomcatTest/HelloForm method="GET">
站点名 :<input type="text" name="name">
<br />
站点 URL:<input type="text" name="url" /><br>
<input type="submit" value="提交" />
</form>
</body>
</html>

에 /TomcatTest/test.html 위의 HTML 콘텐츠에 파일을 저장합니다.

다음으로 우리는 HTTP를 방문 : // localhost를 : 8080 / TomcatTest / test.html를, GIF 데모를 다음과 같이 :

참고 : 위의 경로 중 일부는 더 실제 경로가 프로젝트를 수정해야합니다.

서블릿 쿠키를 통해 읽기

쿠키를 읽으려면() 메서드어레이은 HttpServletRequest대해 getCookies를호출하여javax.servlet.http.Cookie 객체를생성해야합니다. 그런 다음 배열을 통해 루프는 각 쿠키 및 관련의 값에 액세스 할 getName ()와 getValue () 메소드를 사용합니다.

쿠키의 위의 예제 세트를 읽어 보자

package com.w3big.test;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLDecoder;

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;

/**
 * Servlet implementation class ReadCookies
 */
@WebServlet("/ReadCookies")
public class ReadCookies extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public ReadCookies() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
    	Cookie cookie = null;
    	Cookie[] cookies = null;
    	// 获取与该域相关的 Cookie 的数组
    	cookies = request.getCookies();
         
         // 设置响应内容类型
         response.setContentType("text/html;charset=UTF-8");
    
         PrintWriter out = response.getWriter();
         String title = "Delete Cookie Example";
         String docType = "<!DOCTYPE html>\n";
         out.println(docType +
                   "<html>\n" +
                   "<head><title>" + title + "</title></head>\n" +
                   "<body bgcolor=\"#f0f0f0\">\n" );
          if( cookies != null ){
            out.println("<h2>Cookie 名称和值</h2>");
            for (int i = 0; i < cookies.length; i++){
               cookie = cookies[i];
               if((cookie.getName( )).compareTo("name") == 0 ){
                    cookie.setMaxAge(0);
                    response.addCookie(cookie);
                    out.print("已删除的 cookie:" + 
                                 cookie.getName( ) + "<br/>");
               }
               out.print("名称:" + cookie.getName( ) + ",");
               out.print("值:" +  URLDecoder.decode(cookie.getValue(), "utf-8") +" <br/>");
            }
         }else{
             out.println(
               "<h2 class=\"tutheader\">No Cookie founds</h2>");
         }
         out.println("</body>");
         out.println("</html>");
		}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

이전서블릿 ReadCookies를 컴파일하고 web.xml 파일에서 해당 항목을 만들 수 있습니다.8080 / TomcatTest : // localhost를 : HTTP실행하려고 , / HelloForm을 다음과 같은 결과를 표시합니다 :


서블릿에서 쿠키를 제거

제거 쿠키는 매우 간단합니다. 당신이 쿠키를 삭제하려면, 당신은 다음과 같은 세 가지 단계를 수행해야합니다 :

  • 기존의 쿠키를 읽어 들여, 쿠키 객체에 저장합니다.
  • 기존의 쿠키를 삭제하려면 쿠키의 나이 제로 설정 setMaxAge () 메서드를 사용합니다.
  • 응답 헤더에 쿠키를 추가합니다.

다음 예는 "URL"라는 기존의 쿠키, 당신은 서블릿 ReadCookies을 실행할 때 삭제됩니다, 그것은 URL가 null 반환합니다.

package com.w3big.test;

import java.io.IOException;
import java.io.PrintWriter;

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;

/**
 * Servlet implementation class DeleteCookies
 */
@WebServlet("/DeleteCookies")
public class DeleteCookies extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public DeleteCookies() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
    	Cookie cookie = null;
  	  Cookie[] cookies = null;
        // 获取与该域相关的 Cookie 的数组
        cookies = request.getCookies();
        
  	  	// 设置响应内容类型
        response.setContentType("text/html;charset=UTF-8");
   
        PrintWriter out = response.getWriter();
        String title = "删除 Cookie 实例";
        String docType = "<!DOCTYPE html>\n";
        out.println(docType +
                  "<html>\n" +
                  "<head><title>" + title + "</title></head>\n" +
                  "<body bgcolor=\"#f0f0f0\">\n" );
         if( cookies != null ){
           out.println("<h2>Cookie 名称和值</h2>");
           for (int i = 0; i < cookies.length; i++){
              cookie = cookies[i];
              if((cookie.getName( )).compareTo("url") == 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 Cookie founds</h2>");
        }
        out.println("</body>");
        out.println("</html>");
		}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

이전서블릿 DeleteCookies를 컴파일하고 web.xml 파일에서 해당 항목을 만들 수 있습니다.이제HTTP를실행: // localhost를 : 8080 / TomcatTest/ DeleteCookies, 다음과 같은 결과를 표시합니다 :