HTTP 프로토콜
1)서버 - 클라이언트 통신 시 stateless 방식으로 통신. (일회성 연결)
2)브라우저에서 새 웹 페이지를 열면 기존의 웹 페이지나 서블릿에 관한 어떤 연결도 알 수 없다.
-이전 웹 페이지들이 수행한 작업을 다른 웹 페이지에서 알 수 없다.
3)웹 페이지간의 연결 기능이 필요하다.
->일회성 연결에 따른 한계를 극복하기 위해 사용되는 방법
<hidden> 태그, 쿠키(Cookie), HttpSession 객체
Hidden Field
<input type="hidden"...>
-HTML <input> 태그의 hidden 값으로 지정하는 숨김 필드를 사용하는 방식
<hidden 태그 사용하여 로그인 구현하기>
login.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>로그인 창</title>
</head>
<body>
<form name="frmLogin" method="post" action="login2" enctype="UTF-8">
아이디: <input type="text" name="user_id"><br>
비밀번호: <input type="password" name="user_pw"><br>
<input type="submit" value="로그인">
<input type="reset" value="다시 입력">
<input type="hidden" name="user_address" value="서울시 서초구">
<input type="hidden" name="user_email" value="test@gmail.com">
<input type="hidden" name="user_phone" value="010-1234-5678">
</form>
</body>
</html>
|
cs |
loginServlet.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
@Override
public void init() throws ServletException {
System.out.println("init 메서드 호출");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
String user_id = request.getParameter("user_id");
String user_pw = request.getParameter("user_pw");
//hidden 속성으로 전송된 값을 getParameter() 이용해 가져옴.
String user_address = request.getParameter("user_address");
String user_email = request.getParameter("user_address");
String user_phone = request.getParameter("user_phone");
String data = "안녕하세요!<br> 로그인하셨습니다. <br><br>";
data += "<html><body>";
data += "아이디: " +user_id;
data += "<br>";
data += "비밀번호: " +user_pw;
data += "<br>";
data += "주소: " +user_address;
data += "<br>";
data += "이메일: " +user_email;
data += "<br>";
data += "휴대전화: " +user_phone;
data += "<br>";
data += "</body></html>";
out.print(data);
}
@Override
public void destroy() {
System.out.println("destroy 메서드 호출");
}
|
cs |
<실행 화면>
->GET 방식으로 전송하기 때문에 보안에 취약하고,
일일이 로그인 정보를 전송해야 해서 불편하다.
쿠키(Cookie)
1)쿠키(Cookie)
-웹 페이지들 사이의 공유 정보를 클라이언트 PC에 저장해 놓고 사용하는 방법
2)쿠키의 특징
-정보가 클라이언트 pc에 저장됨.
-저장 정보 용량에 제한이 있다.(파일 용량은 4kb)
-보안이 취약함
-클라이언트 브라우저에서 사용 유무를 설정 가능
-웹 사이트(도메인)당 하나의 쿠키가 만들어진다.
3)쿠키의 종류
속성 | Persistence 쿠키 | Session 쿠키 |
생성 위치 | 파일로 생성 | 브라우저 메모리에 생성 |
종료 시기 | 쿠키를 삭제하거나 쿠키 설정 값이 종료된 경우 |
브라우저를 종료한 경우 |
최초 접속 시 전송 여부 | 전송 O | 전송 X |
용도 | 로그인 유무 또는 팝업창 제한할 때 |
사이트 접속 시 Session 인증 정보를 유지할 때 |
4)쿠키 API
-javax.servlet.http.Cookie
-HttpServletResponse의 addCookie() : 클라이언트 브라우저에 쿠키를 전송한 후 저장함.
-HttpServletResponse의 getCookie() : 쿠키를 서버로 가져옴.
-getName() : 쿠키 이름 반환
-getValue() : 쿠키 값 반환
-setMaxAge() : 쿠키 유효 시간을 초 단위로 지정
-getMaxAge() : 쿠키 유효 시간을 초 단위로 반환
쿠키 예제
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLDecoder;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/get")
public class GetCookieValue extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
//브라우저에게 쿠키 정보를 요청한 후 쿠키 정보를 배열로 가져옴
Cookie[] allValues = request.getCookies();
for(int i=0; i<allValues.length;i++) { //배열에서 저장할 때 사용한 쿠키 이름인 cookieTest 검색해 쿠키값 가져옴
if(allValues[i].getName().equals("cookieTest")) {
out.print("<h2>Cookie 값 가져오기 : "+URLDecoder.decode(allValues[i].getValue(),"utf-8")+"</h2>");
}
}
}
}
|
cs |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
@WebServlet("/set")
public class SetCookieValue extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out =response.getWriter();
Date d = new Date();
//Cookie 객체를 생성한 후 cookieTest이름으로 한글 정보 값으로 인코딩해서 쿠키에 저장함.
Cookie c = new Cookie("cookieTest", URLEncoder.encode("Servlet 프로그래밍입니다","utf-8"));
//c.setMaxAge(24*60_60); //유효 기간 설정(하루)
c.setMaxAge(-1); //유효 시간을 음수로 지정하여 Session 쿠키를 만듦.
response.addCookie(c); //생성된 쿠키를 브라우저로 전송함
out.print("현재 시간 : "+d);
out.print("현재 시간을 Cookie로 저장합니다.");
}
}
|
cs |
세션(Session)
1)세션
-웹 페이지들 사이의 공유 정보를 서버의 메모리에 저장해 놓고 사용하는 방법
2)세션의 특징
-정보가 서버의 메모리에 저장
-브라우저의 세션 연동은 세션 쿠키를 이용.
-쿠키보다 보안에 유리
-서버에 부하를 줄 수 있음.
-브라우저(사용자)당 1개의 세션(세션 ID)이 생성됨.
-세션의 유효시간은 기본 30분. (은행 분야에서는 10분)
-로그인 상태 유지 기능이나 쇼핑몰 장바구니 담기 기능 등에 주로 사용됨.
3)세션 얻는 방법
-HttpSession 클래스 객체를 생성해서 사용.
-HttpServletRequest의 getSession() 메서드를 호출해서 얻음.
-getSession() : 기존의 세션 객체가 존재하면 반환하고 없으면 새로 생성
-getAttribute() : session 객체에 저장된 속성 반환
-setAttribute() : session 객체에 속성을 저장
-invalidate() : 현재 세션 정보를 제거
세션 예제01.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@WebServlet("/sess2")
public class SessionTest extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
//최초 요청 시 세션 객체를 새로 생성하거나 기존 세션을 반환함
HttpSession session = request.getSession();
//생성된 세션 객체의 id를 가져옴
out.print("세션 아이디: "+session.getId()+"<br>");
//최초 세션 객체 생성 시간을 가져옴.
out.print("최초 세션 생성 시각: "+new Date(session.getCreationTime())+"<br>");
out.print("최초 세션 접근 시각: "+new Date(session.getLastAccessedTime())+"<br>");
//톰캣 기본 세션 유효 시간을 출력함.
out.print("기본 세션 유효 시간: "+ session.getMaxInactiveInterval()+"<br>");
//세션 유효 시간을 5초로 설정.
session.setMaxInactiveInterval(5);
out.print("세션 유효 시간 : "+ session.getMaxInactiveInterval() + "<br>");
//최초 생성 세션인지 판별함.
if(session.isNew()) {
out.print("새 세션이 만들어졌습니다.");
}
}
}
|
cs |
예제 코드에서 세션의 유효 시간을 5초로 설정했기 때문에 5초가 지나면 세션 아이디가 바뀐다.
'📒 education archive > 📍Servlet, JSP' 카테고리의 다른 글
[국비학원 기록/Servlet] 서블릿 필터(Filter), 필터 한글(utf-8) 인코딩 (0) | 2021.12.06 |
---|---|
[국비학원 기록/Servlet] 서블릿 스코프(scope), URL - pattern (0) | 2021.12.06 |
[국비학원 기록/Servlet] 서블릿 포워드, Redirect(리다이렉트), refresh, location (0) | 2021.12.02 |
[국비학원 기록/Servlet] 데이터베이스 연동 2, JNDI, 회원 정보 등록, 삭제하기 (0) | 2021.11.27 |
[국비학원 기록/Servlet] 서블릿 비즈니스 로직 처리, 데이터베이스 연동 (0) | 2021.11.25 |