반응형
세션(Session)
1. 세션
1)클라이언트가 서버에 접속해있는 동안 그 상태를 유지하는 것이 목적임.
2)웹 브라우저를 통해 서버 접속 => 처리 => 웹 브라우저를 닫아 서버와의
접속을 종료하는 하나의 단위를 세션이라고 한다.
3)HTTP는 기본적으로 일회성 연결 -> 웹 클라이언트 하나하나를 기억할 수 없다.
개인화된 서비스를 제공하려면 웹 클라이언트를 웹 서버에서 인식하고 있어야 한다.
=>웹 클라이언트가 '내가 누구다'라는 데이터를 요청마다 실어보내야 한다.
2. 세션 설정 확인
Dynamic Web Project 생성 시
Generate web.xml deployment descriptor 체크
web.xml에
세션 유효 시간 설정
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
|
<%@page import="java.util.Date"%>
<%@page import="java.text.SimpleDateFormat"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); //날짜 표현 형식
long creationTime = session.getCreationTime(); //세션 생성(최초 요청) 시각
String creationTimeStr = dateFormat.format(new Date(creationTime));
long lastTime = session.getLastAccessedTime(); //마지막 요청 시각
String lastTimeStr = dateFormat.format(new Date(lastTime));
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Session</title>
</head>
<body>
<h2>Session 설정 확인</h2>
<ul>
<li>세션 유지 시간 : <%=session.getMaxInactiveInterval() %></li>
<li>세션 아이디 : <%=session.getId() %></li>
<li>최초 요청 시각 : <%=creationTimeStr%></li>
<li>마지막 요청 시각 : <%=lastTimeStr %></li>
</ul>
</body>
</html>
|
cs |
3. 쿠키 vs 세션
쿠키 | 세션 | |
저장 위치, 형식 | 클라이언트 PC에 text로 저장 | 웹 서버에 Object 타입으로 저장 |
보안 | 보안에 취약 | 보안에 안전 |
속도 | 세션보다 빠름 | 서버 자원 사용하므로 쿠키보다 느림 |
용량 | 용량 제한 O | 서버가 허용하는 한 제약 없음 |
유지 시간 | 쿠키 생성 시 설정, 설정된 시간 경과 시 무조건 삭제 |
web.xml에서 설정, 설정된 시간 내 동작 있다면 유지됨. |
4. 세션과 DB를 이용한 로그인 구현
1)로그인 페이지 작성
LoginForm.jsp
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
|
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Session</title>
</head>
<body>
<h2>로그인 페이지</h2>
<span style="color: red; font-size: 1.2em;">
<%=request.getAttribute("LoginErrMsg") == null? "" : request.getAttribute("LoginErrMsg") %>
</span>
<%
if(session.getAttribute("UserId")==null){ //로그인 상태 확인 => 값이 null이면 저장되지 않은 것
// => 로그아웃 상태를 뜻함
%>
<script type="text/javascript">
function validateForm(form) {
if(!form.user_id.value){
alert("아이디를 입력하세요.");
return false;
}
if(form.user_pw.value==""){
alert("패스워드를 입력하세요.");
return false;
}
}
</script>
<form action="LoginProcess.jsp" method="post" name="LoginFrm" onsubmit="return validateForm(this)">
아이디 : <input type="text" name="user_id"><br>
비밀번호 : <input type="password" name="user_pw"><br>
<input type="submit" value="로그인하기">
</form>
<%
}else{ //로그인된 상태
%>
<%=session.getAttribute("UserName") %> 회원님, 로그인하셨습니다.<br>
<a href="Logout.jsp">[로그아웃]</a>
<%
}
%>
</body>
</html>
|
cs |
2) Member 테이블 생성
3)DB 연동
-JDBCConnection, MemberDAO, MemberDTO
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
|
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.servlet.ServletContext;
public class JDBCConnection {
public Connection con;
public PreparedStatement pstmt;
public ResultSet rs; //select 쿼리문의 결과를 저장할 때 사용됨
public JDBCConnection() {
try {
//JDBC 드라이버 로드
Class.forName("oracle.jdbc.driver.OracleDriver");
//DB에 연결
String url = "jdbc:oracle:thin:@localhost:1521:XE";
String id = "wdsql";
String pwd = "0311";
con = DriverManager.getConnection(url, id, pwd);
System.out.println("DB 연결 성공");
} catch (Exception e) {
e.printStackTrace();
}
}
public JDBCConnection(String driver, String url, String id, String pwd) {
try {
//JDBC 드라이버 로드
Class.forName(driver);
//DB에 연결
con=DriverManager.getConnection(url, id, pwd);
System.out.println("DB 연결 성공 - 매개변수 생성자");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public JDBCConnection(ServletContext application) {
try {
//JDBC 드라이버 로드
String driver = application.getInitParameter("OracleDriver");
Class.forName(driver);
//DB에 연결
String url = application.getInitParameter("OracleURL");
String id = application.getInitParameter("OracleId");
String pwd = application.getInitParameter("OraclePwd");
con = DriverManager.getConnection(url, id, pwd);
System.out.println("DB 연결 성공 - 매개변수 생성자2");
}catch(Exception e) {
e.printStackTrace();
}
}
//연결 해제(자원 반납)
public void close() {
try {
if(rs != null)
rs.close();
if(con != null)
con.close();
if(pstmt != null)
pstmt.close();
System.out.println("JDBC 자원 해제");
} catch (Exception e) {
e.printStackTrace();
}
}
}
|
cs |
DTO (Data Transfer Object)
-데이터를 교환하기 위해 생성하는 객체
-멤버 변수, getter/setter 메서드만 갖춤.
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
|
public class MemberDTO {
//멤버변수
private String id;
private String pass;
private String name;
private String regidate;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPass() {
return pass;
}
public void setPass(String pass) {
this.pass = pass;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getRegidate() {
return regidate;
}
public void setRegidate(String regidate) {
this.regidate = regidate;
}
}
|
cs |
DAO (Data Access Object)
-데이터베이스의 데이터에 접근하기 위한 객체
-JDBC 통해 구현함
-테이블에서 수행할 수 있는 CRUD 전담함.
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
|
import java.sql.SQLException;
import kr.co.ezenac.common.JDBCConnection;
public class MemberDAO extends JDBCConnection{
//명시된 DB로의 연결 완료된 MemberDAO 객체 생성
public MemberDAO(String drv, String url, String id, String pw) {
super(drv, url, id, pw); //부모 클래스의 매개변수 4개짜리 생성자 호출
}
public MemberDTO getMember(String uid, String upass) {
MemberDTO dto = new MemberDTO();
String query = "SELECT * FROM MEMBER WHERE ID = ? AND PASS = ?";
try {
pstmt = con.prepareStatement(query);
pstmt.setString(1, uid); //쿼리문의 첫 번째 파라미터 값 설정
pstmt.setString(2, upass); //쿼리문의 두 번째 파라미터 값 설정
rs=pstmt.executeQuery(); //쿼리문 실행
//결과 처리
if(rs.next()) {
//쿼리 결과로 얻은 회원 정보를 DTO 객체에 저장
dto.setId(rs.getString("id"));
dto.setPass(rs.getString("pass"));
dto.setName(rs.getString(3));
dto.setRegidate(rs.getString(4));
}
} catch (SQLException e) {
e.printStackTrace();
}
return dto; //dto 객체 반환
}
}
|
cs |
LoginProcess.jsp
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
|
<%@page import="kr.co.ezenac.membership.MemberDTO"%>
<%@page import="kr.co.ezenac.membership.MemberDAO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
//로그인 폼으로부터 받은 아이디와 패스워드
String userId = request.getParameter("user_id");
String userPwd = request.getParameter("user_pw");
//web.xml에서 가져온 데이터베이스 연결 정보
String OracleDriver = application.getInitParameter("OracleDriver");
String OracleURL = application.getInitParameter("OracleURL");
String OracleId = application.getInitParameter("OracleId");
String OraclePwd = application.getInitParameter("OraclePwd");
MemberDAO dao = new MemberDAO(OracleDriver, OracleURL, OracleId, OraclePwd);
MemberDTO memberDTO = dao.getMember(userId, userPwd);
dao.close();
if(memberDTO.getId() != null){
//로그인 성공
session.setAttribute("UserId", memberDTO.getId());
session.setAttribute("UserName", memberDTO.getName());
response.sendRedirect("LoginForm.jsp");
}else{
//로그인 실패
request.setAttribute("LoginErrMsg", "로그인 오류입니다.");
request.getRequestDispatcher("LoginForm.jsp").forward(request, response);
}
%>
|
cs |
커넥션풀 사용하지 않고 web.xml에 접속 정보 설정하는 방법도 있다.
Logout.jsp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
//방법1 : 회원 인증 정보 속성 삭제
/* session.removeAttribute("UserId");
session.removeAttribute("UserName"); */
//방법2 : 모든 속성 한꺼번에 삭제
session.invalidate();
//속성 삭제 후 페이지 이동
response.sendRedirect("LoginForm.jsp");
%>
|
cs |
<실행 화면>
LoginForm.jsp 실행
null값이면 아이디 입력 메세지 출력
아이디 일치하지 않을 경우
일치할 경우
로그아웃을 누르면 로그인 페이지로 돌아옴
반응형
'📒 education archive > 📍Servlet, JSP' 카테고리의 다른 글
[국비학원 기록/JSP] 액션태그(2)-useBean, setProperty, getProperty, 회원 가입 구현 (0) | 2021.12.10 |
---|---|
[국비학원 기록/JSP] 액션태그(1) - include, forward (0) | 2021.12.10 |
[국비학원 기록/JSP] 쿠키(Cookie), 팝업창, 로그인 아이디 저장 구현하기 (0) | 2021.12.08 |
[국비학원 기록/JSP] 내장 객체, page, request, 세션(session), 애플리케이션(application) 영역 (0) | 2021.12.07 |
[국비학원 기록/JSP] 스크립트 요소, 선언문, 스크립틀릿, 표현식, 주석문 (0) | 2021.12.07 |