이력서 -> 결과물 -> 포트폴리오(담당파트)스크린샷은 너무 많이 붙이면 안된다. 웹 관련된 것은 crud 4개가 있어야 한다. 화면만 만들어서 캡쳐해서 넣어도 된다. 프로토콜 엑셀파일캡쳐하기.
세션 : 클라이언트 상태를 서버측에서 관리하는 거.
서버 영역 저장공간 = 서버측의 데이터 보관소
쿠키와의 차이점은 세션은 브라우저가 아니라 서버에 값을 저장한다는 점이다.
http프로토콜은 계속 유지하는게 아니라, 연결했다 끊겼다를 반복한다.
그래서 상태정보를 저장할 수 없다. 이전에 클라이언트들이 뭘 했는지 어떤 일을 해왔는지 어떤 정보를 가졌는지를 모른다.
그래서 '상태유지'를 위해서 사용되는 방법이 '세션'이다.
세션은 브라우저가 시작과 종료를 나타냄.
브라우저는 정보를 저장할 때 쿠키사용, 세션은 웹 컨테이너에 정보를 보관할 때 사용.
세션은 오직 서버에서만 생성된다.
클라이언트가 뭘 했는지에 대한 정보를 담당.
클라이언트(브라우저) 당 한개씩 세션이 할당된다.
(클라이언트 담당하는 스레드같은 느낌. 저장소 같은 거.)
쿠키와 마찬가지로 세션도 생성해야만 정보를 저장할 수 있다.
<%@ page session="true"%>
true가 기본 값이다. false를 하는 걸 본 적이 없다. 걍 무조건 true.
위에 처럼 적으면 세션이 생성된다.
브라우저가 처음 접속할 때 세션을 생성하면 이후로는 이미 생성된 세션을 사용한다.
세션 사용한다 = session 기본 객체를 사용한다
session 기본 객체는 속성을 제공해서
setAttribute(), getAttribute()를 사용해서 속성값을 저장하고 읽어올 수 있다.
session 메서드
- getId() : id구하기
- getCreationTime() : 클라이언트가 나에게 첫 요청을 날린 시간 - 바뀌지않는다. 단위 : 1/1000초
- getLastAccessedTime() : 마지막 요청을 날린 시간 - 마지막 요청시간이라서 바뀐다. : 1/1000초
각각의 브라우저마다가 갖는 세션을 구분하기 위해서(사용자를 구분하기 위해서) 세션마다 고유 ID를 할당하는데 그 아이디를 세션ID라고 한다.
서버가 브라우저에게 세션id를 전송하면 브라우저가 쿠키에 세션id를 저장.
그리고 브라우저가 서버에 많은 세션들 중에서 어떤게 내 세션인지 찾을수 있는 세션ID를 요청헤더 넣어서 서버에 보낸다.
그러면 그 아이디를 브라우저가 쿠키에 JSessionID라는 이름으로 세션id를 저장했다가 보내는 거다.
JSessionId : 이 브라우저에게 할당된 세선id같은 거. 세션 식별자.
요청할 때마다 담당하는 세션이 누군지 클라이언트가 보내주는 정보에 의존한다.
쿠키가 차단되어 있으면 로그인을 했음에도 불구하고 다음페이지 가면 로그아웃되어 있고 그럼..
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<%@ page session ="true" %>
<%@ page import ="java.util.Date" %>
<%@ page import ="java.text.SimpleDateFormat" %>
<%
Date time = new Date();
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>세션 정보</title>
</head>
<body>
세션ID : <%= session.getId() %><br>
<%
time.setTime(session.getCreationTime());
%>
세션시간 : <%=formatter.format(time) %><br>
<%
time.setTime(session.getLastAccessedTime());
%>
최근 접근시간: <%=formatter.format(time) %>
</body>
</html>
<결과>
한 번 생성된 세션은 지정한 유효 시간동안 유지.
세션은 데이터 저장소 같은 거. 세션은 내부자원이 아니니까 읽고 쓸 때 훨씬 더 부담이 없다.
특히, 사용자의 id같은 것들, 로그인 후에 글쓰기할 때 글쓰는 정보들이 들어간다.
그래서 여러사이트 같은 데 id가 쓰이면 그걸 세션에 넣어두면 된다.
세션의 값은 오직 서버에만 저장.
세션은 쿠키 설정 여부와 관계없이 사용할 수 있다.
하지만 세션은 여러 서버에서 공유할 수 없다.
session.invalidate() : 세션을 종료시키는 메서드.
세션객체가 없어진 게 아니다. invalidate()되면 속성에 접근할 수 없게 된다는 뜻이다.
set,getAttribute()가 안된다.
새로세션이 만들어지는 장소는 invalideate()한 페이지가 아니라
그 다음 페이지에서 다음요청에서 새롭게 생성된다.
그럼 새로운 세션이 생기는 다음페이지 가서 뭔가를 해야한다. 하지만, 다음 페이지에 얻을 세션을 미리 구할 수 있다.
request.getSession()를 쓰면 미리 할 수 있다. invalidate()와 같이 기억하기.
세션을 종료하면 현제 사용중엔 session 기본 객체를 삭제하고 session 기본 객체에 저장했던 속성 목록도 함께 삭제한다.
sessionInfo를 열고 closeSession을 연 후에 sessionInfo를 열면 그 전의 세션이 종료되고, 새로운 세션이 생성되는 걸 볼 수 있다.
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<%
session.setAttribute("myName", "myValue");
out.println("before:" + session.getId());
session.invalidate(); //이걸 한다고 해서 세션이 사라지는 게 아니라는 얘기다.
//새로세션이 만들어지는 장소는 인벨리데이트페이지가 아니라
//그 다음 페이지에서 다음요청에서 새롭게 생성된다는 얘기다.
out.println("arter:" + session.getId());
// 세션객체가 없어진 게 아니다.
//인벨리디트 되면 속성에 접근할 수 없게 된다. get이 안되면 set도 안된다.
//다음페이지 가서 뭔가를 해야한다. 새로운 세션이 생기니까.
//다음 페이지에 얻을 세션을 미리 구할 수 있다.
session = request.getSession();
// 이아이를 쓰면 미리 할 수 있다. invalidate()와 같이 기억하기.
out.println("<br>");
out.println(session.getAttribute("myName"));
out.println("<br>");
out.println("new :" + session.getId());
out.println("<br>");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>세션종료</title>
</head>
<body>
세션을 종료하였습니다.
</body>
</html>
마지막 요청을 날린 거 기준(session.getLastAccessedTime())으로 시간을 잡고, 30분(예시)이 지나고 아무런 요청을 안하면 그냥 다른 곳에 갔다고 생각하고 그 전 사이트의 session을 삭제한다. 그러면 로그아웃되어있을 것이다.
설정시간 2가지 방법
1.web.xml에서<session-timout>
태그를 사용 : 단위는 '분'단위
2.setMaxInactiveInterval() 메서드 사용 : 단위는 '초'단위
서블릿 나중에 할 때, service()안에는 request와 response가 기본객체로 있는데,
이때 request에서 session객체를 구하고 session에서 application객체를 구할 수 있다.
request.getSession() 메서드는 session이 invalidate()되었느냐의 문제이다.
invalidate()되지 않았으면 session을 리턴하고, invalidate()되었으면 새롭게 session을 생성한다!
getSession() = getSession(true)
어제 쿠키대신 세션을 넣은 느낌.
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<%
String id = request.getParameter("id");
String password = request.getParameter("password");
if(id.equals(password)){
session.setAttribute("MEMBERID", id);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>로그인성공</title>
</head>
<body>
로그인에 성공했습니다.
</body>
</html>
<%
}else {//로그인실패시
%>
<script>
alert("로그인에 실패하였습니다.");
history.go(-1);
</script>
<%
}
%>
<%@ 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/sessionLogin.jsp" method="post">
아이디<input type="text" name="id" size="10"/>
암호 <input type="password" name="password" size="10"/>
<input type="submit" value="로그인">
</form>
</body>
</html>
멤버id의 유무를 판단. 뭐인지 판단X.
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<%
String memberId =(String)session.getAttribute("MEMBERID");
boolean login = memberId == null ? false:true;
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>로그인 여부 검사</title>
</head>
<body>
<%
if(login) {
%>
아이디"<%=memberId %>"로 로그인한 상태
<%
}else {
%>
로그인하지 않은 상태
<%
}
%>
</body>
</html>
<결과>
논리적이든 물리적이든 분리가 되면 그냥 다른 것이다.
같은 application에서만 공유된다. 같은 서버에 있다고 해서 같은 세션이 아니다.