/**
* @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은 파라미터가 있다. 파람값은 true
와 false
두 개이다.
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처럼 저장하고 싶은 것에 대한 제약이 없다.
원하는 타입을 지정해주면 된다.
el로 간편하게 출력 가능
${sessionScope.이름}
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("이름", 값);
위와 같이 담는다.
정보를 담을 수 있는 jsp/servlet 내장 객체
종류 : page, request, session, application
모두 setAttribute(), removeAttribute(), getAttribute()를 갖는다.
저장한 정보가 언제까지 유지돼야 하느냐에 따라 달라진다
request.setAttribute("이름", 값);
→ 한 요청이 응답을 보낼 때까지 정보가 살아있음
(response되면 정보는 사라지는것)
session.setAttribute("이름", 값);
→ 세션이 무효화 될 때까지 정보가 살아있음
프로젝트 내의 모든 파일 사용 가능
(예를들어 로그아웃 될 때까지)
session.removeAttribute("이름");
→ 세션에 저장한 정보 삭제
로그아웃 할 때까지 지속해야하는 정보가 있을 때 사용하기 위해서
ex) 로그인 아이디, 멤버타입 (판매자, 구매자), 등급
<%@ 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>
<%@ 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>
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);
}
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);
}