session:
request와 response의 1회성을 극복하기 위해 만들어짐.
(데이터가 유지되지 않는 단점을 극복하기 위해 )
클라이언트와 서버가 연속적으로 대화를 하는 현재과정을 하나의 session이라는 객체 저장한다.
클라이언트에 저장하면 cookie 서버에 저장하면 session
session는 모든 타입의 용량을 서버에 저장시킬 수 있다.
하지만 그렇다고 session에 불필요한 정보를 많이 넣으면 서버가 힘들어할 수 있다.
대부분의 은행에서 사용하는 어플 30분동안 로그인이 유지되고 초과하면 자동으로 로그아웃
필요없는 페이지에서는 session을 안쓰게 만들 수 있다.
request는 기본적으로 유지가 안되고 제한적으로 forward를 시키는 경우에만 1회의 유지가된다.
하지만 session은 계속 forward 할 필요없이 session에 한번만 저장해놓으면 아무리 새로고침을 하더라도 유지가된다.
클라이언트가 유저의 아이디를 쿠키에 저장하고있으면 원래쓰던 session ID를 다시 꺼내서 쓸 수 있다.
전제조건은 클라이언트가 서버를 끊어야한다.
만약 클라이언트가 로그아웃을 누르면 session이 폐기되서 꺼내올 수 없다.
session.getMaxinactiveInterval() 세션의 유지시간 중간에 어떠한 동작이라도 있다면 최대유지시간이 다시 갱신된다.
isNew() = 현재 세션이 새로운 새션인가 = 세션유지시간이 30초가 초과된 후 새로운 세션이 만들어졌는가
session : 대부분 로그인의 정보를 저장하기 위해서 사용한다.
session을 지정해서 간단한 로그인 폼 구현하기
<form method="POST" action="ex02-action.jsp">
<p><input type="text" name="userid" placeholder="ID"></p>
<p><input type="password" name="userpw" placeholder="Password"></p>
<p><input type="submit" value="로그인"></p>
</form>
요청방식을 POST로 지정, 요청을 action.jsp로 넘겨준다.
<% request.setCharacterEncoding("UTF-8"); %>
입력값의 인코딩서식을 UTF-8로 지정한다.
<jsp:useBean id="user" class="member.MemberDTO" />
<jsp:setProperty property="*" name="user"/>
member패키지의 MemberDTO클래스에서 user라는빈객체를 생성하고
property값은 객체 user를 *로 모든 자료형을 받을 수 있도록 만들어준다.
MemberDAO의 싱글톤
private static MemberDAO instance;
public static MemberDAO getInstance() {
if(instance == null) {
instance = new MemberDAO();
}
return instance;
}
<c:set var="dao" value="${MemberDAO.getInstance() }" />
<c:set var="login" value="${dao.login(user) }" scope="session" />
MemberDAO의 싱글톤 객체인 instance를 생성하는 함수를 dao로 선언해서 객체로 만들어준다.
MemberDAO의 함수 (login)을 value로 지정하고 scope 를 session으로 지정한다.
만약 지정하지않으면 기본 attribute는 pageContext
스크립트로 login이 빈문자열이라면 반환된 login이 null이라는 뜻이므로 로그인 실패
아니면 로그인성공을 경고메세지로 띄워주고 ex02-index.jsp로 넘겨준다.
<script>
const login = '${login}'
if(login ==''){
alert('로그인실패')
}
else {
alert('로그인성공')
}
location.href = 'ex02-index.jsp'
</script>
ex02-index.jsp
<c:if test="${empty login }">
<a href="ex02-form.jsp"><button>로그인</button></a>
</c:if>
<c:if test="${not empty login }">
<h3>현재사용자 : ${login.userid } (${login.username })</h3>
<a href="ex02-logout.jsp"><button>로그아웃</button></a>
</c:if>
만약 로그인이 비어있다 = null
로그인폼으로 연결하는 버튼을 만들어주고
만약 비어있지않다 = 반환된 login에 데이터가 담겨있다면
사용자의 아이디와 이름을 출력시켜주고 로그아웃페이지 로 연결하는 버튼 만들어준다.
logout.jsp
<%
session.invalidate();
response.sendRedirect(request.getContextPath()+ "/ex02-index.jsp");
%>
로그아웃 페이지에서는 스크립틀릿으로 session의 현재 페이지를 폐기하고 session.invalidate();
ex02-index.jsp로 리다이렉트 시킨다.
네이버로 갔다가 다시 주소로 돌아와도 로그인이 유지되어있다. (attribute를 session으로 지정했기에)
sessionID를 출력해보면 새로고침을 눌러도 로그아웃을하거나 서버를 껐다가 끄지않는 이상
현재 session이 그대로 유지가 되면서 지정된 시간동안 로그인이 유지된다.
열린 창을 완전히 껐다가 다시실행해보면
sessionID를 확인해보면 끝자리가 C6E3에서 A826으로 바뀐 것을 알 수 있다. 새로운 세션이 생성되어있다.
로그아웃을 누르거나, 창을 완전히 닫으면 현재 session을 폐기한다. 로그인에 담긴 데이터가 사라진다.
즉, session = 서버에저장하는 클라이언트의 락커룸
세션의 최대유지시간을 직접 지정할 수 있다.
<%
session.setMaxInactiveInterval(600); //로그인 유지시간 600초 (10분)
%>
세션 비활성화 주기를 0으로 설정하면, 세션 유지시간이 무한대가 되어버린다. (금지)
세션을 폐기하는 내장함수는 따로있다 session.invalidate();
이처럼 로그인기능을 구현할때 session을 활용해서 지정된 세션만료시간으로 로그인 정보를 유지시킬 수 있다.
'JSP' 카테고리의 다른 글
Servlet (0) | 2023.09.01 |
---|---|
Connection Pool (커넥션 풀) , singleton(싱글톤) (0) | 2023.08.10 |
JSTL (0) | 2023.08.07 |
EL 태그 (1) | 2023.08.04 |
영화정보를 El태그, action태그를 사용해서 추가하기 (0) | 2023.08.04 |