01session
기본객체 중 하나이다
(이전 게시글에서 잠깐 다루었다 - 타입, 설명, 메소드까지)
서로다른 브라우저에서 공유하지 않는다 (값 전달 불가) ex.크롬, 사파리, 시크릿모드 등
같은 브라우저에서 온 request 가 공유한다
<%
Integer count = (Integer) session.getAttribute("count");
if (count == null) {
session.setAttribute("count", 1);
}
%>
<%= session.getAttribute("count") %>
<%
Integer c = (Integer) session.getAttribute("count");
c ++;
session.setAttribute("count", c);
%>
count 를 받아옴. null 이면 1을 저장함. count 반환. count 1 늘려서 다시 저장.
새로고침을 할 때마다 1씩 증가한다
02session
세션을 유지하는 방법
첫번째 요청에 대한 응답에 쿠키를 포함, 두번째 요청부터 같은 쿠키를 가지고 있으면 같은 브라우저에서 온 요청이라고 판단.
03attribute1,2,3
파일1 에서 session.setAttribute 로 food=apple 전달함
파일2,3 에서 food 값 반환 (apple)
그런데 어떻게 파일1 에서 넣어준 값이 별개의 파일 2,3 으로 전달되었지? 쿠키!
파일2,3 먼저 실행하면 null 이 뜬다
파일1 먼저 실행하면 같은 브라우저이기 때문에 기록을 가지고 있게된다. 쿠키! (session 으로 전달했잖아)
04attr1,2
1
<form action="04attr2.jsp">
<select name="food" id="">
<option value="banana">banana</option>
<option value="apple">apple</option>
<option value="berry">berry</option>
<option value="melon">melon</option>
<option value="water">water</option>
</select>
<br>
<input type="submit" value="등록">
</form>
from 안에 select 안에 option
from 의 action 속성으로 다음 파일2로 데이터 전달 - submit 하면 파일2로 넘어감
option 5개 주어지는 창으로 페이지 표시됨
선택한 항목이 food 의 값으로 저장됨
2
<%
Set<String> set = (Set<String>) session.getAttribute("foods");
if (set == null) {
set = new HashSet<>();
session.setAttribute("foods", set);
}
String food = request.getParameter("food");
if (food != null) {
set.add(food);
}
%>
<a href="04attr1.jsp">다시 선택하기</a>
<div>
<h1>선택한 음식들</h1>
<ul>
<%
for (String item : set) {
%>
<li><%= item %></li>
<%
}
%>
</ul>
</div>
HashSet
foods 가져와 set 에 저장, 만약 foods 가 null 이면 객체를 새로 만들고 set 값을 저장 (처음에 foods 는 null)
파일 1 에서 전달받은 food 를 받아와 food 가 null 이 아니면 set 에 food 를 추가
다시 선택하기 페이지 링크 (파일1) 을 걸어주고 선택한 음식들을 표시 (set 에서 받아오는 듯?)
결론: 파일1에서 하나 선택할 때마다 파일2에서 선택한 항목들을 모두 나타냄
05attr1,2
04와 같은데, HashMap 으로 한듯
항목 하나가 몇번 선택되었는지까지 표시됨
04파일은 한번 선택한 항목이 재선택한다고 해서 다시 추가되지는 않음
05파일도 추가는 안되는데 카운트를 해줌
06login,logout,main
login
로그인창
아이디를 받아서 string id 에 저장하고 null 이 아니면 session.setAttribute 로 username 에 저장
메인페이지(main파일)로 가는 링크 걸기
logout
세션삭제!! session.invalidate();
로그인창(login파일), 메인페이지(main) 으로 이동하는 링크 걸어줌
main
username 받아서 문자열 name 으로 저장
name 이 null 이 아니면 ---님 반갑습니다. 로그아웃 페이지 링크.
null 이면 손님 반갑습니다.
07invalidate1,2
1
선택창 (form>select>option), Hashset 으로 선택한 항목 받아서 리스트로 띄워줌
파일2를 링크로 걸었음 (세션지우기)
2
곧바로 session.invalidate(); 로 세션 지움
링크로 파일1 걸었음 (다시 선택하기)
08MaxInactiveInterval
session.setMaxInactiveInterval(10);
() 안의 숫자는 초단위
설명)
첫번째 응답에 주는 쿠키를 받고 시간이 지나면 세션이 초기화되기 때문에 다시 쿠키를 준다
각 브라우저마다 가지고 있지만 어떤 하나의 세션만 가능하다
client 요청 사이에 이 세션이 열린 상태로 유지되는 시간(초) 를 지정하게 된다
만약 setMaxInactiveInterval 반환값이 0이하이면 세션이 절대 시간 초과되지 않는다
09session-timeout-get,session-timeout-set
set 에서 session.setAttribute 로 food=pizza 값 넣어주었고
get 에서 session.getAttribute 로 food 값 꺼내어 반환
문제는, timeout 이겠지?
*참고
프로젝트 우클릭 - java ee tools - generate deployment descriptor stub
하면 WEB-INF 안에 web.xml 만들어짐
어플리케이션 설정 파일이다
파일을 열면 파싱된 design 이 있고 (뭔소리야), 직접 작성하려면 source 에서 작성하면 된다
* 타임아웃 설정 (우선순위는 1. → 2. → 3.)
1. session.setMaxInactiveInterval
아 위에서 한 게 이거였구나
2. DD(deployment desciptor)
방금 위의 '참고'에서 만든 파일
↓ 예를 들면, 클라이언트가 5분동안 요청이 없으면 세션 제거함 (분단위이다!!)
<web-app>
<session-config>
<session-timeout> 5 </session-timeout>
</session-config>
</web-app>
3. 설정하지 않으면 WAS 기본값 적용
톰캣의 경우 30분
다시, 09번으로 돌아와
파일 실행 전 DD 의 timeout 을 1분으로 설정해줌
(web.xml 실행 - 하단 탭의 source, server - 상단 창에서 webapp 태그 안에 코드 작성)
set 파일 실행, get 파일 실행
1분 후 get 파일을 실행하면 food 값이 null 로 뜬다
세션이 만료되었기 때문!
10login-form,main,process
로그인 세션 만료 시켜보겠지.
login-form
그냥 로그인 창, form 의 action 속성에서 process 파일로 보내줌
process
로그인 작업 (아이디 받아서 user 에 저장)
main 으로 리디렉션
main
로그인 안했으면 - 손님 반갑습니다, 로그인 링크 걸어주기
로그인 했으면 - (아이디)님 반갑습니다, 로그아웃 걸어주기
'course 2021 > JSP' 카테고리의 다른 글
JSP11 - 10scope (0) | 2021.11.19 |
---|---|
JSP10 - 09cookie (0) | 2021.11.19 |
JSP08 - 07redirect (0) | 2021.11.17 |
JSP07 - 06forward (0) | 2021.11.17 |
JSP06 - 05attribute (0) | 2021.11.17 |