* 본 글은 [뉴렉처]의 Servlet&JSP 프로그래밍 강의를 듣고 정리한 글입니다.
2020 Servlet&JSP 프로그래밍
www.youtube.com
Cookie의 path 옵션: 해당 path 요청일 때만 쿠키 읽기
Cookie의 path 옵션
- 쿠키는 페이지마다 다름
- 특정 서블릿 or 특정 범주 안에 있는 서블릿에 올 때만 가져오는 쿠키
- 서버가 보낸 응답을 브라우저가 저장하도록 서블릿에서 쿠키를 설정할 때 URL을 설정할 수 있음 > setPath( )메소드 사용
- 비효율적으로 쿠키가 여러 가지 값을 전달하거나 쿠키 이름이 충돌나는 경우를 방지할 수 있음
Cookie의 path 옵션 사용하기
- 쿠키객체명.setPath(”path”);
- 해당 path로 요청될 때만 해당 쿠키를 가져와라
- path(인자로 들어가는 값): 어느 경우에 브라우저에 저장된 쿠키가 서버에게 읽혀야 하는지를 결정하는 경로
- 쿠키객체명.setPath(”/”);
- 어떤 서비스를 요청하든 쿠키가 무조건 서버로 전달됨
- 쿠키객체명.setPath(”/calc2”);
- path가 calc2인 요청에 대해서만 쿠키가 서버로 전달됨
- 쿠키객체명.setPath(”/notice/”);
- notice 디렉토리 안에 있는 서비스를 요청할 때만 쿠키가 서버로 전달됨
- path 옵션을 사용한 코드
Cookie valueCookie = new Cookie("value", String.valueOf(v));
Cookie opCookie = new Cookie("op", op);
valueCookie.setPath("path");
opCookie.setPath("path");
response.addCookie(valueCookie);
response.addCookie(opCookie);
Cookie의 path 옵션 사용하기 예시
- setPath(”path”)에서 path를 /로 설정
- /로 요청이 오면 쿠키를 저장하라는 의미
Cookie valueCookie = new Cookie("value", String.valueOf(v));
Cookie opCookie = new Cookie("op", op);
valueCookie.setPath("/");
opCookie.setPath("/");
response.addCookie(valueCookie);
response.addCookie(opCookie);
Cookie의 path 옵션 사용하기 결과
- value로 3, op로 + 입력 후 개발자 도구 > Response Headers 확인
- Response Headers: 서버가 클라이언트에게 돌려주는 메타데이터
- path가 /로 설정되어 있음
- 서버가 addCookie( )메소드를 사용해 응답 값으로 전달한 value와 op 쿠키를, 클라이언트가 저장했음
- value로 13, op로 = 입력 후 개발자 도구 > Request Headers 확인
- Request Headers: 클라이언트가 서버에게 전달하는 메타데이터
- path가 /로 설정되어 있고
- 클라이언트가 getValue( )메소드를 사용해 요청 값으로 전달한 value와 op 쿠키를, 서버가 읽었음
Cookie의 path 옵션에 변주 주기
- setPath(”path”)에서 path를 /가 아니라 /add로 설정
- /add로 요청이 오면 쿠키를 저장하라는 의미
- 해당 서블릿은 매핑 주소가 /calc2
- path가 다르기 때문에 서버가 읽을 쿠키가 없음
Cookie valueCookie = new Cookie("value", String.valueOf(v));
Cookie opCookie = new Cookie("op", op);
valueCookie.setPath("/add");
opCookie.setPath("/add");
response.addCookie(valueCookie);
response.addCookie(opCookie);
Cookie의 path 옵션에 변주 주기 결과
- 먼저 localhost의 쿠키를 모두 삭제
- value로 3, op로 + 입력 후 개발자 도구 > Response Headers 확인
- 서버가 전달한 value와 op 쿠키를 클라이언트가 저장하는 건 가능
- value로 13, op로 = 입력 후 개발자 도구 > Request Headers 확인
- 클라이언트가 요청 값으로 전달한 value와 op 쿠키를 서버가 읽는 게 불가능
- 쿠키가 전달되지 않았기 때문에 결과에도 오류 발생
- Request Headers를 보면 쿠키가 SID 하나만 전달됐음을 알 수 있음
- localhost:8090/add를 브라우저 URL 입력창에 입력하면 HTTP 상태는 500으로 오류가 발생하지만, 쿠키는 정상적으로 전달되는 걸 알 수 있음
Cookie의 path 옵션을 적용한 서블릿과 HTML
- Calc2.java
package com.newlecture.web;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/calc2")
public class Calc2 extends HttpServlet {
@Override
protected void service(HttpServletRequest request
, HttpServletResponse response)
throws ServletException, IOException
{
ServletContext application = request.getServletContext();
HttpSession session = request.getSession();
Cookie[] cookies = request.getCookies();
//response의 인코딩 방식 지정
response.setContentType("text/html; charset=UTF-8");
response.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();
String v_ = request.getParameter("v");
String op = request.getParameter("operator");
//기본값 처리
int v = 0;
if(!v_.equals("")) {v = Integer.parseInt(v_);}
//값을 계산
if(op.equals("=")) {
// int x = (Integer)application.getAttribute("value");
int x = 0;
for(Cookie c : cookies) {
if(c.getName().equals("value")) {
x = Integer.parseInt(c.getValue());
break;
}
}
int y = v;
// String operator = (String)application.getAttribute("op");
String operator = "";
for(Cookie c : cookies) {
if(c.getName().equals("op")) {
operator = c.getValue();
break;
}
}
int result = 0;
if(operator.equals("+")) {
result = x + y;
} else {
result = x - y;
}
response.getWriter().printf("계산 결과는 %d\\n", result);
}
//값을 저장
else {
// application.setAttribute("value", v);
// application.setAttribute("op", op);
// session.setAttribute("value", v);
// session.setAttribute("op", op);
Cookie valueCookie = new Cookie("value", String.valueOf(v));
Cookie opCookie = new Cookie("op", op);
valueCookie.setPath("/calc2");
opCookie.setPath("/calc2");
response.addCookie(valueCookie);
response.addCookie(opCookie);
}
}
}
- calc2.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>계산기 웹 프로그램</title>
</head>
<body>
<form action="calc2" method="post">
<div>
<p>계산할 값을 입력하세요.</p>
</div>
<div>
<label>입력 : </label>
<input type="text" name="v"/>
</div>
<div>
<input type="submit" name="operator" value="+">
<input type="submit" name="operator" value="-">
<input type="submit" name="operator" value="=">
</div>
</form>
</body>
</html>
'☕ Java 웹 프로그래밍 > Servlet & JSP' 카테고리의 다른 글
[Servlet&JSP] Application, Session, Cookie 정리 (0) | 2023.06.01 |
---|---|
[Servlet&JSP] Cookie의 maxAge 옵션: 브라우저와 상관없이 설정한 기간 동안 쿠키 유지 (0) | 2023.06.01 |
[Servlet&JSP] Cookie로 상태 값 유지하기 (0) | 2023.06.01 |
[Servlet&JSP] Session 객체로 상태 값 저장하기 (+ Application 객체와의 차이점) (0) | 2023.06.01 |
[Servlet&JSP] Application 객체로 상태 값 저장하기 (0) | 2023.05.29 |