티스토리 뷰
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> </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
'KH 정보교육원 [ Java ]' 카테고리의 다른 글
KH 97일차 - JSP ( 내장 객체 ) ( ****** ) (0) | 2022.07.15 |
---|---|
KH 96일차 - Servlet( 파일 다운로드 ) / JSP ( *****) (0) | 2022.07.14 |
KH 94일차 - 세션 (**) (0) | 2022.07.12 |
KH 93일차 - MVC 패턴 (*****) (0) | 2022.07.11 |
KH 92일차 - 공유데이터 영역 (***) (0) | 2022.07.08 |
댓글