50일차 2023-05-17
JSP
이클립스 설정(Html, css 자동완성 설정)
*help탭->install Software-> http://oss.opensagres.fr/tern.repository/1.2.1/를 add의 location에 추가, 이름은 js플러그인(마음대로 가능)->
우클릭 configure->에서 설정->나중에 수정하고 싶으면->
프로젝트 우클릭(properties)->Tern->Module에서 체크 or 해제
ApplicationScopeIndex.jsp -> ApplicationScopeResult.jsp
ApplicationScopeIndex.jsp
결과)
(클릭하세요 클릭 시) ApplicationScopeResult.jsp
결과)
cookie05 폴더 생성
쿠키는 서버에 부담을 줌 그래서 요즘은 웹 스토리지를 사용함. (저번에 했었음)
쿠키 단점:암호화가 안됨
- 쿠키 설정 절차 및 동작방식
1) 클라이언트가 처음 서버에 접근하면 서버는 쿠키를
생성하고 http응답 헤더에 쿠키를 실어서 보낸다.
2) 후에 사용자가 그 사이트를 다시 방문하는 경우
웹브라우저는 저장된 쿠키 정보를 서버에 전송한다.
3) 서버는 이 쿠키 정보를 이용해 필요한 작업을 수행한다.
=>
http프로토콜의 특징으로 요청과 응답을 하고 바로 서버와 끊어진다
이런 클라이언트의 상태정보를 알아내기 위해 쿠키를 사용
요청 시 서버에서 쿠키 생성
그 쿠키를 응답헤더에 같이 넣어줌 그걸 클라이언트에 보냄(클라이언트에 저장됨)
다시 클라이언트에서 서버에 요청하면 전에 받은 쿠키도 요청 때 같이 보냄. 그럴 때 서버가 쿠키가 있다는 걸 앎.
그래서 서버는 그 쿠키를 보고 계속 접속하고 싶다는 걸 있다는 걸 앎
(쿠키는 만료 기간이 있다)
- 쿠키의 주요 메서드
String getName():쿠키의 이름 리턴
String getValue():쿠키의 값 리턴
String getPath():쿠키의 적용 경로 리턴 - setPath()로 미 설정 시 null
int getMaxAge():쿠키의 유효시간 리?- setMaxAge()로 미 설정시 -1
setValue(String value):쿠키의 값 설정
setDomain(String domain):쿠키가 적용되는 도메인 설정
서브도메인에도 쿠키를
적용하고자 할 때에는 ".도메인"을 넣어준다
예] www.naver.com에서 생성한
쿠키를 mail.naver.com에서도 적용하고자 할 때
setDomain(".naver.com");
setPath(String path):쿠키가 적용되는 경로지정
지정한 경로 또는 하위 경로에만 대해서만 쿠키가 적용된다.
예]
setPath("/notice");notice디렉토리와 그 하위
디렉토리에서만 쿠키를 사용할 수 있다
setPath("/"):웹 어플리케이션 전체 경로에서 사용하고자 할 때
setMaxAge(int exp):쿠키의 유효시간을 초 단위로 설정.
유효시간을 설정하지 않으면 쿠키정보는
웹브라우저 메모리에 저장되고
웹브라우저를 닫으면 자동으로 삭제된다.
유효시간을 설정하는 경우 쿠키정보는 사용자의 pc에 저장된다.
- 쿠키에 값 저장 시(로그인 처리)
1) 쿠키 개체 생성
javax.servlet.http.Cookie cookie =
new javax.servlet.http.Cookie(String name, String value)
2) 생성한 쿠키를 response개체를 통해 응답헤더에 추가
response.addCookie(쿠키개체)
예]
Cookie cookie = new Cookie("memID", "choi");
response.addCookie(cookie);
- 쿠키에 저장된 값 읽어 오기(로그인 여부 판단)
-request개체의 getCookies() 메서드를 이용해서 읽어온다.
Cookie[] cookies = request.getCookies()
예]
Cookie[] cookies = request.getCookies();
if(cookies!=null && cookies.length > 0){
for(int i =0;i< cookies.length;i++){
out.println("쿠키명: "+cookies[i].getName()+",쿠키 값:"+cookies[i].getValue()+"<br/>");
}
}
- 쿠키 삭제(로그아웃)
-setMaxAge()메서드의 인자값을 0을 주어서 삭제한다.
Cookie cookie = new Cookie("memID","");
cookie.setMaxAge(0);
response.addCookie(cookie);
- 쿠키값 변경
해당 쿠키명으로 다시 Cookie개체를 생성하면 된다.
단, 해당 쿠키가 없을 때는 새롭게 쿠키가 생성된다
예]
Cookie[] cookies = request.getCookies();
if(cookies!=null && cookies.length > 0){
for(int i =0;i< cookies.length;i++){
if(cookies.getName().equals("memID")){
Cookie cookie = new Cookie("memID","lim");
response.addCookie(cookie);
}
}
}
- 쿠키의 구성 요소
형태 : 웹서버가 웹브라우저에 전달하는 쿠키를 설정할 때
Set-COOKIE : name=value ; expire=date ; path=path; domain=domain; secure
name: 각 쿠키를 구별하는 데 사용되는 이름
value : 쿠키의 이름에 해당하는 값
expire : 쿠키 유효 기간. expire을 기술하지 않으면 현재 웹브라우저가 실행되는 동안만 유효함
domain: 쿠키가 적용되는 도메인
path: 쿠키가 적용되는 디렉토리 경로
- 쿠키 이름 및 값에 대한 규칙(RFC2109 규약)
:쿠키 이름은 아스키코드 알파벳과 숫자만 포함할 수 있다.
:콤마(,), 세미콜론(;), 공백('') 등의 문자는 포함할 수 없다.
:$로 시작할 수 없다.
따라서 한글등을 쿠키값에 포함하려면 반드시 인코딩 처리를 해줘야 한다.
예]
Cookie cookie =
new Cookie(URLEncoder.encode("이름","UTF-8"),URLEncoder.encode("홍길동","UTF-8"));
response.addCookie(cookie);
out.println(URLDecoder.decode(cookie.getName()));
out.println(URLDecoder.decode(cookie.getValue()));
CookieIndex.jsp
결과)
CookieResult.jsp
CookieExamIndex.jsp -> CookieExamCartProcess.jsp
CookieExamIndex.jsp -> CookieExamCartEmpty.jsp
CookieExamIndex.jsp -> CookieExamCartShow.jsp -> CookieExamIndex.jsp
CookieExamIndex.jsp -> CookieExamLoginProcess.jsp
CookieExamIndex.jsp(로그인된 상태) -> CookieExamLogout.jsp
CookieExamIndex.jsp
CookieExamCartProcess.jsp
Result.jsp에서 Network에서 cookie
CookieExamCartEmpty.jsp
CookieExamCartShow.jsp
CookieExamLoginProcess.jsp
CookieExamLogout.jsp
session폴더 생성
쿠키는 클라이언트에 상태정보를 저장하고 세션은 서버에 저장된다
그런데 세션도 쿠키를 사용하긴 한다.
세션객체에 정보가 저장됨
세션도 요청과 응답을 하면 끊어진다.
외부적으로는 요청을 하면 서버에서 내부적으로 쿠키를 만듦.
*(요청을 하면 세션 객체를 할당받음(이건 서버에 저장됨))
세션은 브라우저 하나당 한 개 생성
브라우저를 받을 때까지 세션 안 끊김
세션 객체는 같은 브라우저에서 있으면 계속 살아있다(유효기간이 있는데 디폴트는 30분)
[세션(Session)]
- 세션이란?
클라이언트가 서버에 접속해 있는 상태를 말하는 것으로
방문자가 웹 브라우저를 열어 서버에 접속하고 다시 웹브라우저를 닫아
서버와의 연결을 종료하는 하나의 단위를 세션이라 함 즉
접속한 상태의 유지기간을 의미함
- 클라이언트의 상태정보를 저장하기 위한 기술.
내장 개체 중 session개체에 정보가 저장됨.
- 쿠키는 클라이언트에 저장되지만 session은 서버에 저장된다.
- session 개체는 웹브라우저당 1개의 개체가 할당되어
사용자 인증에 관련된 작업을 수행 시 주로 사용
- page 지시자의 session 속성이 "true"인 경우에만 사용 가능.(기본값 true)
- session개체는 일정시간 동안
아무런 요청도 하지 않으면 자동적으로 삭제된다
(기본: 30분)
-세션 설정 시 내부적으로 JSESSIONID라는 쿠키명으로 세션아이디값을
쿠키값으로 설정한다.
- session개체의 주요 메서드
String getId(): 해당 세션의 세션 ID를 return
long getCreationTime():
session의 생성된 시간을 1970년 1월 1일 이후 흘러온
시간을 1/1000초 단위로 return
long getLastAccessedTime():
웹 브라우저의 요청이 마지막으로 시도된 시간을
1970년 1월 1일 이후 흘러온 시간을 1/1000초 단위로 return
void setMaxInactiveInterval(time):
session을 유지할 시간을 초 단위로 설정
int getMaxInactiveInterval():세션유지 시간 얻기
void invalidate():세션 기본개체가 삭제됨.
즉 할당된 세션의 속성값을 모두 제거, 주로 세션을 종료할 때 사용.
boolean isNew(): 새로운 클라이언트인지 판단.
즉 새로운 세션이면 true , 아니면 false 리턴
- 세션 유효 시간 설정
가) web.xml에서
WEB-INF/web.xml에 <session-config> 엘리먼트에서 설정(분 단위)
<session-config>
<session-timeout>20</session-timeout>
</session-config>
나)session개체의 메서드로 설정(초 단위)
session.setMaxInactiveInterval(60*20);
- 세션개체에 값 저장시(로그인 처리)
session.setAttribute(String key,Object value)
- 값 읽어 올때(로그인 여부 판단)
Object value=session.getAttribute(String key);
- 세션 개체의 특정 속성 삭제
session.removeAttribute(속성명);
- 세션개체에 저장된 모든 속성 삭제시(로그아웃 처리)
session.invalidate();
소스예] 모든 세션개체에 저장된 값 읽어 오기
Enumeration<String> en=session.getAttributeNames();
while(en.hasMoreElements()){
String key= en.nextElement();
Object val = session.getAttribute(key);
out.println(key+"==="+val.toString()+"<br/>");
}
sessionIndex.jsp - > SessionResult.jsp
SessionIndex.jsp
web.xml
결과)
SessionResult.jsp
결과)
결론: request와 session의 영역 속성은 요청헤더에 값이 가는 게 세션영역 속성에 저장된 값이 넘어가고 리퀘스트 영역은 넘어가지 않는다.
브라우저(client)에서 서버로 요청할 때 리퀘스트 객체 생성되고 영역이 생성.
세션도 똑같이 세션객체 생성되고 영역이 생성
객체가 차지해야 될 공간이 있어야 생성될 수 있으니 영역이 생성됨
그리고 이 서버에서 다시 브라우저에 응답할 때 request객체 삭제(요청을 처리되면 삭제),
session객체는 서버에 저장되는 객체이다.
따라서,
request객체는 단일요청, session객체는 클라이언트의 상태 유지하기 위한 여러 요청과 응답 간에 사용됨.
request객체는 요청일 처리되면 삭제, session객체는 일정기간 유지(30분) 클라이언트가 세션이 종료, 만료될 때 삭제된다.