KOSTA 31일차) 세션 이용하는 법 / session / cookie / 로그인 회원가입

해버니·2023년 4월 10일
0

KOSTA

목록 보기
26/32
post-thumbnail

session 기본 id 출력

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		HttpSession session = request.getSession();
		session.setAttribute("param1", "value1");

		String val = (String) session.getAttribute("param1");
		System.out.println("session에 저장한 값 : " + val);

		String sessionId = session.getId();
		System.out.println("sessionId" + sessionId);
	
		session.invalidate();
		session = request.getSession();
		sessionId = session.getId();
		System.out.println("new sessionId : " + sessionId);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}








세션 생성 및 얻기

HttpSession session = request.getSession();

현재 사용중인 세션을 획득하는 메서드이다.
현재 사용중인 세션이 있으면 그 세션을 반환해주고 현재 사용중인 세션이 없다면 새로 생성해서 준다.


getSession은 파라미터가 있다. 파람값은 truefalse 두 개이다.
getSession(true) : 현재 사용중인 세션
getSession(false) :이미 생성된 세션이 있을 때 그 세션을 반환하고, 없으면 null을 반환한다.
위 코드는 ()안에 아무것도 안들어가져있는데 default 값은 true이다.






그리고 session은 자동 생성이 된다.
session을 invalidate()해도 바로 새 session이 생성된다.

jsp 페이지 : session 내장 객체 사용
servlet 페이지 : HttpSession session = request.getSession();







기본적으로 세션은 30분 유지된다.
30분 이상 서버에 전혀 반응을 보이지 않으면, 세션이 자동으로 끊어진다.
이 세션 유지 시간은 web.xml 파일에서 설정할 수 있다.

<session-config>
	<session-timeout>30</session-timeout>
</session-config>











세션에 값 저장

session.setAttribute("param1", "value1");
session.setAttribute("이름", 값);

이름, 저장하고 싶은 값.
request.setAttribute처럼 저장하고 싶은 것에 대한 제약이 없다.
원하는 타입을 지정해주면 된다.





세션에서 정보를 꺼내려면?

jsp 페이지

el로 간편하게 출력 가능

${sessionScope.이름}

servlet 페이지

String val = session.getAttribute("이름");

object 타입이기 때문에 받고 싶은 타입으로 다운 캐스팅을 해야한다.







세션 값 조회하기

String val = (String) session.getAttribute("param1");

session.getAttribute()는 반환 타입이 객체라서 다운그레이드를 해줘야 한다.





String sessionId = session.getId();

session id는 주민등록번호 같은 존재이다.
session id는 연결을 구분하는 '고유한 값'이다.
16진수형태 문자열로 '중복되지 않는 난수'를 만들어준다.
각각 클라이언트한테 배포를 하게 되고 클라이언트가 서버에 요청을 할 때마다 헤더에 담아서 보낸다.








세션 삭제

session.invalidate();

로그아웃 처리. 세션 무효화



새 세션 발급

session = request.getSession();

새 세션 발급










프로젝트 경로

${pageContext.request.contextPath}

<form action="${pageContext.request.contextPath }/Join" method="post">
<form action="/webApp4/Join" method="post">
// 위와 아래는 경로가 같다.

경로를 직접 바꿔주면 어떤 건 바뀌고 어떤 건 놓칠 수도 있기 때문에 이런식으로 경로를 맞게 지정해준다.










세션과 쿠키

http 프로토콜은 연결 유지를 하지 않는다.

TCP는 연결지향적이기 때문에 연결을 유지하면서 데이터를 주고 받는다.
그런데 http 프로토콜은 request와 response 두 가지의 기능이 있는데 이때 요청하고 응답을 하게되면 연결을 끊어버리기 때문에 전혀 기억하지 못하게 된다.


로그인이 (억지로) 유지되는 것처럼 만들어야하는데 그것을 해주는 것이 세션쿠키이다.
두 개 다 사용해도 되고 하나만 사용해도 된다.

세션과 쿠키 : 계속 연결이 유지되는 것처럼 프로그래밍에 사용하는 객체








세션

서버에 저장
객체형태로 저장
크기에 제약 없음




쿠키

클라이언트 컴퓨터에 저장
텍스트 형태로 저장
크기에 제약이 있다


지금까지는 request.setAttribute("이름", 값); 에 정보를 저장했는데 세션에 저장하는 것도 똑같다.

session.setAttribute("이름", 값);

위와 같이 담는다.





scope 객체

정보를 담을 수 있는 jsp/servlet 내장 객체

종류 : page, request, session, application
모두 setAttribute(), removeAttribute(), getAttribute()를 갖는다.
















❓ 그럼 언제는 request쓰고 언제는 session 쓰는건데?

저장한 정보가 언제까지 유지돼야 하느냐에 따라 달라진다




request.setAttribute("이름", 값);

→ 한 요청이 응답을 보낼 때까지 정보가 살아있음
(response되면 정보는 사라지는것)



session.setAttribute("이름", 값);

→ 세션이 무효화 될 때까지 정보가 살아있음
프로젝트 내의 모든 파일 사용 가능
(예를들어 로그아웃 될 때까지)



session.removeAttribute("이름");

→ 세션에 저장한 정보 삭제












session을 사용하는 이유

로그아웃 할 때까지 지속해야하는 정보가 있을 때 사용하기 위해서
ex) 로그인 아이디, 멤버타입 (판매자, 구매자), 등급



세션을 이용한 회원가입 / 로그인

idcheck.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
<script type="text/javascript">
// 이 윈도우가 로드되자마자 실행되는 핸들러
window.onload=function(){
	// request.method : 전송방식 값을 갖는 속성 (GET, POST)
	if('${pageContext.request.method}' == 'GET'){ // GET일 때
		ff.id.value = opener.document.f.id.value;
	} else { // POST일 때
		// id 중복체크를 눌렀을 때
		
		let html = "";
		if('${flag}'=='true'){
			html = "사용가능한 아이디";
			let val = '${id}';
			ff.id.value = val;
			html += "<input type='button' value='아이디사용' onclick='a(\""+val+"\")'>";
		} else{
			html = "사용불가능한 아이디";
		}	
		let div = document.getElementById("res");
		div.innerHTML = html;
		
	}
}
function a(id){
	//opener.document.f.id.value = id;
	close();
}
</script>
</head>
<body>
<h3>ID중복체크</h3>

<form action="${pageContext.request.contextPath }/member/idcheck" method="post" name="ff">
id: <input type="text" name="id">
<input type="submit" value="id 중복체크">
</form>
<div id="res">
</div>
</body>
</html>






join.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
<script>
function idcheck(){
	// 팝업창 띄우는 버튼
	// open(param1, param2, para3) 새 윈도우를 생성
	// param1 : 이 창을 띄울 페이지
	// param2 : 새 윈도우 이름
	// param3 : 새 창에 대한 세부 설정 (윈도우 설정)
	// 리턴값 : 생성된 윈도우 객체. 
	let win = open('idcheck.jsp', 'win', 'width=500, height=200, top=300, left=300');
	// top=300, left=300은 위로부터 300떨어진, 왼쪽으로부터 300떨어진 곳에 팝업창 띄우는 것
    
	win.document.ff.id.value = f.id.value;
	// win.close(); // 팝업창 닫음
}
</script>
</head>
<body>
<h3>회원가입</h3>
<form action="${pageContext.request.contextPath }/member/join" method="post" name="f">	
	<table border="1">
		<tr><th>ID</th>
		<td>
			<input type="text" name="id">
			<input type="button" value="id중복체크" onclick="idcheck()">
		</td></tr>
		<tr><th>PWD</th><td><input type="text" name="pwd"></td></tr>
		<tr><th>NAME</th><td><input type="text" name="name"></td></tr>
		<tr><th>EMAIL</th><td><input type="text" name="email"></td></tr>
		<tr><th>가입</th><td><input type="submit" name="가입" value="가입하기"></td></tr>
	</table>
</form>

</body>
</html>






idCheck.java

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		String id = request.getParameter("id");
		MemberService service = new MemberService();
		MemberVo vo = service.getMember(id);
		
        boolean flag = (vo == null);
		// 검색된 결과가 있다면 false -> id가 이미 있음        
        
		request.setAttribute("flag", flag);
		
		if(flag) { // id가 중복되지 않았다면
			request.setAttribute("id", id);
			// idcheck.jsp에 출력하기 위해서 request에 담음 
		}
		RequestDispatcher dis = request.getRequestDispatcher("/member/idcheck.jsp");
		dis.forward(request, response);
		// forward는 서버내에서 이동! 
		// post이기 때문에 다시 idcheck.jsp로 넘어가도 ${pageContext.request.methd}가 POST로 존재하는 것이다.
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}






Logout.java

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		HttpSession session = request.getSession(false); 
		// 새 세션 말고 쓰던 세션을 가져와라.
		session.invalidate();
		// 세션 무효화 : 로그아웃 처리
        
		System.out.println(request.getContextPath());
		RequestDispatcher dis = request.getRequestDispatcher("/index.jsp");
		dis.forward(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}






0개의 댓글