티스토리 뷰

1.    쿠키의 기본적인 성질 

-      1 ) 작은 데이터이다.

-      2 ) 이름이 부여되어 있다. ( 이름 = 데이터() )

-      3 ) Request / Response Message의 헤더에 저장되어서 주고 받는다.

-      4 ) 웹 브라우저는 사이트 주소마다 해당 사이트에서 받은 쿠키를 사이트 주소별로 파일을 만들어서, 쿠키를 보관하고 관리한다.

-      5 ) 웹 브라우저는 특정 사이트에 재접속시, 해당 사이트에서 주었던 쿠키데이터를 파일에서 읽어서 다시 Request Message의 헤더에 저장되어 항상 전송한다!

-      6 ) 기간만료가 지정 되어있기에, 기간만료가 되면 폐기 처분한다.


[ 1. 쿠키로 장바구니 실습 ] (****)

 

[ 1 - 1. 상품 페이지 만들기 ]

 

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>product.html</title>
</head>
<body>

<h1>쿠키 - FrontController 패턴실습</h1>

<form action="/CartSaveCookie" method="GET">
    <input type="radio" name="product" value="BMW" checked>BMW<br>
    <input type="radio" name="product" value="SM5">SM5<br>
    <input type="radio" name="product" value="K7">K7<br>
    <input type="submit" value="카드저장">
</form>

</body>
</html>

 

[ 1 - 2. 상품을 장바구니에 넣기 - 쿠키를 헤더에 넣는다. ]

 

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;

import lombok.Cleanup;
import lombok.NoArgsConstructor;
import lombok.extern.log4j.Log4j2;


@Log4j2
@NoArgsConstructor

@WebServlet("/CartSaveCookie")
public class CartSaveCookieServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
		
		log.trace("service(req, res) invoked.");
		
		// 1. 화면에서 전송한 장바구니에 저장할 품목(전송 파라미터)을 획득
		String product = req.getParameter("product");
		
		// 2. 요청 메세지의 헤더에 포함되어있는 모든 쿠키를 획득
		Cookie [] cookies = req.getCookies();
		// Cookie 타입의 객체를 원소로 하고 있는 객체배열 반환
		
		// 3. 우리가 직접 새로운 쿠키를 생성
		Cookie c = null;
		
		// 4. 2단계에서 얻은 쿠키배열이 무효하다면 / 유효하다면
		if ( cookies == null || cookies.length == 0 ) {
			c = new Cookie("product", product);
		} else {
			c = new Cookie("product" + (cookies.length + 1), product);
		} // if - else
		
		// 5. 우리가 생성한 쿠키의 만료시간을 지정 ( 초 단위이다. )
		// 현재는 1시간 동안 유지하도록 하였다.
		c.setMaxAge(60 * 60);
		
		// 6. 응답메세지 헤더에 우리가 3에서 생성한 쿠키객체를 저장
		// 응답문서에 새로운 쿠키를 추가하여 응답을 보낸다.
		res.addCookie(c);
		
		// 7. 응답문서 준비
		
		res.setContentType("text/html; charset=utf8");
		
		@Cleanup
		PrintWriter out = res.getWriter();
		
		out.println("<html><body>");
		
		out.println("product 추가하기");
		out.println("<a href='/CartBasketCookie'>장바구니 보기</a>");
		
		out.println("</body></html>");
		
		out.flush();
		
	} // service

} // end class

 

[ 1 - 3. 장바구니에 있는 상품 조회 - 헤더에 있는 쿠키 조회 ]

 

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;

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 lombok.Cleanup;
import lombok.NoArgsConstructor;
import lombok.extern.log4j.Log4j2;


@Log4j2
@NoArgsConstructor

@WebServlet("/CartBasketCookie")
public class CartBasketCookieServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
		
		log.trace("service(req, res) invoked.");
		
		// 1. 나의 모든 장바구니 항목을 담고 있는 쿠키 목록을 웹 브라우저가
		// request message의 헤더에 담아서 보내게 되어 있다. ( 웹 브라우저의 기본동작 )
		Cookie [] baskets = req.getCookies();
		log.info("* basket : {}", Arrays.toString(baskets));
		
		// 2. 응답문서 생성
		res.setContentType("text/html; charset=utf8");
		
		@Cleanup
		PrintWriter out = res.getWriter();
		
		if( baskets == null ) {
			out.println("장바구니가 비어있습니다.<br>");
		}else {
			
			for( Cookie cookie : baskets ) {
				String name = cookie.getName();
				String value = cookie.getValue();
				
				out.print("<h2>" + name + " : " + value + "</h2>");
			} // enhanced for
			
		} // if - else
		
		out.print("<a href='product.html'>상품선택 페이지</a><br>");
		out.print("<a href='/CartDeleteCookie'>장바구니 비우기 페이지</a><br>");
		
		out.flush();
		
	} // service

} // end class

 

[ 1 - 4. 장바구니에 있는 상품 삭제 - 쿠키 만료기간을 1초로 변경 ]

 

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;

import lombok.Cleanup;
import lombok.NoArgsConstructor;
import lombok.extern.log4j.Log4j2;


@Log4j2
@NoArgsConstructor

@WebServlet("/CartDeleteCookie")
public class CartDeleteCookieServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
		
		log.trace("service(req, res) invoked.");
		
		// 클라이언트 브라우저에 쿠키파일로 저장되어있는 모든 장바구니 데이터를 삭제
		// How? -> 각 쿠키의 만료기간을 조작
		
		// 웹 브라우저가 보낸 request 메세지의 헤더에 있는 모든 쿠키를 배열로 획득
		Cookie [] basket = req.getCookies();
		
		if( basket != null ) { // 장바구니가 있다면
			
			for ( Cookie cookie : basket ) {
				
				// 1초의 만료기간으로 변경된 쿠키들을 다시 웹 브라우저에 보내면,
				// 웹 브라우저는 이 사이트 주소에 대해 파일로 보관중이던 
				// 모든 쿠키의 만료기간이 1초 단축되었기에
				// 1초 후에 모든 쿠키를 파괴시킨다.
				// + 0초로 하면, 기간을 무한정으로 바꿔버린다.
				
				cookie.setMaxAge(1);
				
				// 시간만료가 설정된 쿠키를 브러우저로 전송
				res.addCookie(cookie);
				
			} // enhanced for
			
		} // if
		
		// 응답문서 생성
		res.setContentType("text/html; charset=utf8");
		
		@Cleanup
		PrintWriter out = res.getWriter();
		
		out.print("<a href='product.html'>상품선택 페이지</a><br>");
		
		out.flush();
		
	} // service

} // end class

[ 2. 쿠키 생성 및 삭제 ]

 

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;

import lombok.Cleanup;
import lombok.NoArgsConstructor;
import lombok.extern.log4j.Log4j2;


@Log4j2
@NoArgsConstructor

@WebServlet("/TTT")
public class TTT extends HttpServlet {
	private static final long serialVersionUID = 1L;

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
		
		log.trace("service(req, res) invoked.");
		
		// ==  쿠키 생성  ==================================
		
		// Cookie 변수명 = Cookie(String name, String value)
		Cookie name = new Cookie("name","wowwwowwwowwwowwwoww");
		Cookie age = new Cookie ("age","23");
		
		name.setMaxAge(1 * 60 * 60); // 1시간의 만료기간 설정
		age.setMaxAge(1 * 60 * 60); // 1시간의 만료기간 설정
		
		// ==  쿠키 삭제  ==================================
		
		name.setMaxAge(1); // 1시간의 만료기간 설정
		age.setMaxAge(1); // 1시간의 만료기간 설정
		
		res.addCookie(name);
		res.addCookie(age);
		
		// ==  응답문서 생성  ==================================
		
		res.setContentType("text/html; charset=utf8");
		
		@Cleanup
		PrintWriter out = res.getWriter();
		
		// out.print("<p> 2개의 쿠키를 보냈으니, 잘 저장하세요</p>");
		out.print("<p> 2개의 쿠키를 보냈으니, 잘 삭제하세요</p>");
		
		out.flush();
		
	} // service

} // end class

[ 3. 파일 업로드 하기 ] (****)

 

[ 3 - 1. 화면 만들기 - enctype="multipart/form-data" ]

 

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>FileUpload 실습</title>
</head>

<body>

    <h1>FileUpload 실습</h1>

    <form 
        action="/Upload" 
        method="post" 
        enctype="multipart/form-data">

        1. 작성자 : <input type="text" name="writer"> <br>
        2. 업로드 파일 : <input type="file" name="uploadFile" multiple> <br>

        <p>&nbsp;</p>

        <input type="submit" value="업로드">

    </form>

</body>

</html>

 

[ 3 - 2. 파일 업로드 및 다운로드 하기 ]

 

package org.zerock.myapp;

import java.io.IOException;
import java.util.Collection;

import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;

import lombok.NoArgsConstructor;
import lombok.extern.log4j.Log4j2;

@Log4j2
@NoArgsConstructor

@WebServlet("/Upload")

// maxFileSize의 기본 단위는 바이트로 1024 * 1024 * 20는 최대파일크기가 20mb라는 이야기이다.
// maxRequestSize는 최대 Multipart의 수를 의미한다.
// location는 저장할 위치를 지정하게 된다.

@MultipartConfig(maxFileSize = 1024 * 1024 * 20,location = "c:/Temp/upload")
public class UploadServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
		
		log.trace("service(req, res) invoked.");
		
		req.setCharacterEncoding("utf8");
		
//		============================================
		
		// 1. 일반적인 전송파라미터의 값 획득
		String writer = req.getParameter("writer");
		log.info("\t + 1. writer :{}", writer);
		
//		============================================
		
		// 2. 파일 데이터가 저장된 멀티파트의 개별파트마다
		// @MultipartConfig 어노테이션의 location 속성에 지정된
		// 경로에 첨부파일을 저장하자
		
//		============================================
		
		// (1) 개별파트로부터 획득 : 파트 1개만 얻어낼 수 있다.
		
		Part part1 = req.getPart("uploadFile");
		log.info("\t + 2. part1 :{}", part1);
		
//		============================================
		
		// (2) 획득한 특정 파트의 각종 정보를 획득 및 출력
		
		String name = part1.getName();
		long size = part1.getSize();
		String contentType = part1.getContentType();
		String submittedFileName = part1.getSubmittedFileName();
		
		log.info("\t + 3. name :{}", name);
		log.info("\t + 4. size :{}", size);
		log.info("\t + 5. contentType :{}", contentType);
		log.info("\t + 6. submittedFileName :{}", submittedFileName);
		
		Collection<String> headerNames = part1.getHeaderNames();
		
		// headerNames.forEach(log::info);
		
		headerNames.forEach(s -> {
			log.info("\t + 7. header Name : {}", s);
			// 7번은 헤더의 이름이 나오게 된다.
			
			log.info("\t + 8. {} : {}", s, part1.getHeader(s));
			// 8번은 헤더의 이름 : 해당 헤더의 값을 찍게 된다.
		});
		
//		============================================
		
		// (3) 파트에 저장된 파일 데이터를 디스크의 지정(@MultipartConfig)된 폴더에 저장
		
		part1.write(submittedFileName); // location=c:/Temp/upload/{submittedFileName}로 저장
		part1.delete();					// 디스크에 파일 저장시 사용된 임시파일 삭제
		
		// + 이때 임시파일은 대용량 파일을 다운받을때 생기는 임시파일을 의미한다.
		
//		============================================
		
	} // service

} // end class

 

 

728x90
댓글
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
최근에 올라온 글
Total
Today
Yesterday
공지사항