웹(경로,쿠키)

제이·2023년 5월 2일
0

목록 보기
14/15
post-thumbnail

파라미터 접근하기 전에 request.setCharacterEncoding()을 해줘야 한다.
<jsp:setProperty name="memberInfo" property="*"/> 이거 하기 전에 위에 거를 해줘야 한다.


<책에는 안나온다>


a태그가 말하는 루트 : http://localhost:8080/
form 루트 :http://localhost:8080/
sendRedirect : http://localhost:8080/
forward 루트 : http://localhost:8080/05.02/whatIsRoot.jsp

루트의 기준은 다르다. 어디에서 뭘 쓰느냐에 따라서.
경로가 복잡해질 때, 거기서 어딘가로 찾아가야할 때.
다른 위치에서 submit해야하는 경우, a태그로 다른 위치로 가야하는 경우, redirect를 이용해서 다른 위차가 가야하는 경우 등등
-> 절대경로를 사용하는데, http://localhost:8080/로 하지말고,
💡따라서, getContextPath()를 쓴 다음에 경로를 써주기.

이러면 정상적으로 나온다.

jsp에서는 if,for문을 잘 사용하지 않고 나중에 배울 태그로 처리를한다.
jsp에서는 값을 꺼내오는 건 되지만, 값을 바꾸거나 만들거나 하면 안된다.


클라이언트와의 대화1(쿠키)

클라이언트의 상태정보를 저장하기 위해 2가지
1.클라이언트와의 대화1 : 크게 중요X - 쿠키. 클라이언트에서 상태를 관리. 보조적인 수단이어야한다.
2.대화2가 중요. - 서버에서 상태를 관리하는 거.

<대화1>
쿠키는 웹 브라우저가 보관하는 데이터.
'아이디 기억하기 기능'은 쿠키 이용의 대표 기술이다.
클라이언트에서 생성한 쿠키는 의미가 없다. 상태 정의를 클라이언트가 내릴 수 없다.
클라이언트가 서버한테 뭔가를 할때 계속 이름을 말하게 하면 서버가 클라이언트를 기억할 필요가 없다.
쿠키는 출력버퍼처럼 헤더에 담겨서 넘어간다.
웹브라우저는 저장한 쿠키를 요청이 있을 때마다 웹 서버에 전송한다.

모든 브라우저에는 쿠키를 허용하지 않는 옵션이 있다.
서버측에서는 '냥냥야 이름 말해'라고 하지만, 클라이언트에서 쿠키를 사용하지 않으면 반응이 없을 것이다.
일반적으로 쿠키로 하는 것이 다 되지만 안되는 사람 한두명이 있을 수 있어서 안쓰는 게 좋다.
그래서 보조적인 수단으로 사용한다.
쿠키에서는 이름과 값이 중요. 파라미터와 비슷한 느낌.
이름과 값은 문자열이다. 이름이 식별자. 알파벳과 숫자만사용.
쿠키값은 서버가 만드는데, 여기에 한글을 넣는다는 발상자체가 잘못된거다. 한글넣는거 아니다.

쿠키 생성하기

jsp에서 쿠키 만들 일 없다. 쿠키를 생성할 때에는 Cookie 클래스를 사용한다.
addCookie() 사용하면 응답헤더에 쿠키값이 자동으로 들어간다.

Cookie cookie = new Cookie("cookieName", "cookieValue");
response.addCookie(cookie);

이름하나 값하나만 있다. 속성같은 거 아니다.

cookie.getName()/cookie.getValue() - 중요한 메서드다!!!!
쿠키에서 값을 뽑아내는 메서드.
여러개 잡아넣을거면 쿠키를 여러개 만들어야 한다.

makeCookie.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<%@page import="java.net.URLEncoder" %>
<%
Cookie cookie = new Cookie("name", "myValue");
response.addCookie(cookie);	
//이것만 해주면 됩니당. 이름과 벨류를 가진 쿠키가 헤더에 추가가 된다. 
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>쿠키생성</title>
</head>
<body>
<%=cookie.getName() %> 쿠키의 값="<%= cookie.getValue() %>"	
//중요한 메서드다!!!!
</body>
</html>

<결과>

쿠키 값 읽어오기

Cookie[] cookie = request.getCookies();
쿠키 값을 뽑아온다. 쿠키의 값을 읽어올 수 있는 메서드
위의 makeCookie를 읽어 올 수 있다

viewCookie.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<%@ page import ="java.net.URLDecoder" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>쿠키 목록</title>
</head>
<body>
쿠키목록<br>
<% Cookie[] cookies = request.getCookies();	
//브라우저 알아서 헤더에 쿠키정보를 심어준다. 
	if(cookies != null && cookies.length >0) {	//쿠키가 있냐
		for(int i =0; i<cookies.length; i++) {
%>
	<%=cookies[i].getName() %> = <%=cookies[i].getValue()%><br>

<%
		}
	}else {
%>
쿠키가 아직 존재하지 않습니다.
<%
	}
%>
</body>
</html>

<결과>

쿠키 값 변경 및 쿠키 삭제하기

<변경>
쿠키 심기 전에 setValue()할 수 있는 거고,
보낸 후에 쿠키를 변경하려면, name은 똑같이 맞춰주고 -> vlaue값을 바꿔주기.
기존의 것을 바꾸는 게 아니라 걍 덮어씌우는거.
쿠키가 여러개일 때 내가 원하는 어떤 것인지 식별을 해야하는데, 그때 이름으로 구분한다.
이름이 식별자라서, 이름이 같은 게 있으면 덮어씌운다. value는 중복되든 말든 상관없다.
만약 이름이 mimi를 변경하기 위해서는 아래와 같이 적으면 된다.

Cookie cookie = new Cookie("mimi", "새로운 값");
response.addCookie(cookie);

<삭제>

cookie.setMaxAge(0); : 당장 쿠키를 삭제해준다.
cookie.setMaxAge(-1); : 브라우저가 종료되면 쿠키가 삭제된다.

쿠키의 도메인

기본적으로 쿠키는 그 쿠키를 생성한 서버에만 전송된다.
네이버에서 만든 걸 카카오에서 보낼 리가 없다.

같은 도메인을 사용하는 모든 서버에 쿠키를 보내야 할 때
setDomain() 을 사용한다.

2가지 형식으로 도메인을 지정할 수 있다.
1,-.글자 같은 걸로 시작하면 글자 거기만 보낸다.(main.naver.com)
'.'으로 시작하면 .으로 시작하는 거 다 보낸다.(.naver.com)

setDomain()의 값으로
1.나랑 같은 거(현재 서버의 도메인).
2.상위도메인만 보낼 수 있다.
서버에서 'javacan.naver.com'을 jsp파일에 보내게 된다면.
c1 : .naver.com(o)
c2 : javacan.naver.com(o)
c3 : javacan.tistory.come(X)-전송은 되지만 브라우저에서 저장하지 않는 것.

쿠키 도메인이 쿠키를 생성한 서버의 도메인을 벗어나면 웹 브라우저는 쿠키를 저장하지 않는다.

cf) www.somehost.com랑 .somehost.com이랑 다른 거다.

세션은 브라우저를 켜고 끌때까지인데 그걸 어떻게 알 수 잇을까?
이 클라이언트를 담당하는 세션이 누구냐를 '쿠키'를 이용해서 안다.

쿠키의 경로

그냥 루트로 걍 경로 보내면 된다. 브라우저가 알아서 분류해서 처리함.
중요X.
setDomain()으로 내가 경로를 지정할 수 있구나 정도만 알기.
어차피 루트사용할거라서..뭐... 지정안해도 된다.
경로를 따로 지정해주지 않으면 현재경로로 인식.

쿠키의 유효시간

쿠키는 유효시간을 갖는다.
유효시간 지정 안하면 브라우저 종료할 때 쿠키 삭제된다.(-1을 주는 것과 같은 효과)

setMaxAge() :유효기간 지정 메서드. 초단위.

쿠키와 헤더

response.addCookie()로 쿠키를 추가하면 헤더에 들어간다.
WAS가 알아서 해준다. 우리는 걍 add해주면 된다.

쿠키를 사용한 로그인 상태 유지

여기서 Cookies.java는 쿠키를 편하게 만들 수 있는 util같은 것이다.

Cookies.java

package util;

import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.Map;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;

public class Cookies {
	private Map<String,Cookie> cookieMap = new java.util.HashMap<String, Cookie>();
	
	public Cookies(HttpServletRequest request) {
		Cookie[] cookies = request.getCookies();
		if(cookies != null) {
			for(int i=0; i<cookies.length ;i++) {
				cookieMap.put(cookies[i].getName(), cookies[i]);
                //쿠키객체 자체를 value값으로 넣는다. 
			}
		}
	}
	
	public Cookie getCookie(String name) {
		return cookieMap.get(name);
	}
	public String getValue(String name) throws IOException {
		Cookie cookie = cookieMap.get(name);
		if(cookie == null) {
			return null;
		}
		return URLDecoder.decode(cookie.getValue(), "euc-kr");
	}
	
	public boolean exists(String name) {
		return cookieMap.get(name) != null;
	}
	
	public static Cookie createCookie(String name, String value) throws IOException {
		return new Cookie(name, URLEncoder.encode(value, "euc-kr"));
		
	}
	
	public static Cookie createCookie(String name, String value, String path, int maxAge) throws IOException {
		Cookie cookie = new Cookie(name, URLEncoder.encode(value, "euc-kr"));
        // 이 부분 대신에 바로 위의 createCookie()를 쓰는 게 더 좋은 방법이다.
		cookie.setPath(path);
		cookie.setMaxAge(maxAge);
		return cookie;
	}
	public static Cookie createCookie(String name, String value, String domain, String path, int maxAge) throws IOException {
		Cookie cookie = new Cookie(name, URLEncoder.encode(value, "euc-kr"));
		cookie.setDomain(domain);
		cookie.setPath(path);
		cookie.setMaxAge(maxAge);
		return cookie;
	}

}

loginForm.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>로그인폼</title>
</head>
<body>

<form action="<%= request.getContextPath() %>/member/login.jsp" 
	method="post">
아이디 <input type="text" name="id" size="10">
암호 <input type="password" name="password" size="10">
<input type="submit" value="로그인">	
</form>

</body>
</html>

login.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<%@ page import = "util.Cookies" %>
<%
	String id = request.getParameter("id");
	String password = request.getParameter("password");
	
	if(id.equals(password)) {
		//ID와 암호가 같으면 로그인에 성공한 것으로 판단.
		response.addCookie(
			Cookies.createCookie("AUTH", id, "/", -1)
            //maxAge(0)넣으면 지워진다. 당장지우는거. 
            //-1은 브라우저 끌 때 지우는거. 
		);
	
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>로그인 성공</title>
</head>
<body>
로그인에 성공했습니다.
</body>
</html>
<%
	} else {//로그인 실패시
%>
<script>
alert("로그인에 실패하였습니다.");
//경고창 띄우기
history.go(-1);
// 이전 페이지로 이동하는 JavaScript 함수
</script>
<%
	}
%>

loginCheck.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<%@ page import = "util.Cookies" %>
<%
	Cookies cookies = new Cookies(request);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>로그인 여부 검사</title>
</head>
<body>
	
	<%
		if(cookies.exists("AUTH")) {
	%>
	아이디 "<%= cookies.getValue("AUTH") %>"로 로그인 한 상태
	<%
		}else {
	%>
	로그인하지 않은 상태
	<%
		}
	%>
</body>
</html>

logout.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<%@ page import = "util.Cookies" %>
<%
	response.addCookie(
		Cookies.createCookie("AUTH","","/",0)		
	);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>로그아웃</title>
</head>
<body>
로그아웃하셨습니다.
</body>
</html>
profile
Hello :)

0개의 댓글