로그인, 쿠키, EL, JSTL

조성현·2023년 5월 8일
0

hard coding(기초)
modle1(기본 베이스)
mvc model2(model1 상위호환)
controller -> servlet -> parameter/url => 게시판

상태(값) 유지 => 로그인 => 회원관리
로그인
: 회원에 대한 정보 유지 -> 로그아웃/프로그램 종료 시 까지

상태(값)의 저장 구역

  • page : 한 페이지 내에서의 저장
  • request : 하나의 request(include/forward)
  • session : 브라우저 종료 /session 삭제 까지
  • application : tomcat 종료 시 까지 -> 전 사이트에 공유

= HashMap

  • setAttribute("키", 값);
  • setAttribute("키")

참고 자료 : https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=exploit_code&logNo=220088741485

pageContext

session

: 브라우저가 꺼지기 전까지 같은 아이디를 가짐

DFD를 통해 로그인 만들기

로그인 과정
: 로그인 폼(login_form.jsp)
(id, p/w, 회원등급 ...)
로그인 확인(login_ok.jsp)
성공
(세션부여)
성공확인 페이지(login_complete.jsp)
세션검사
성공 페이지 내용
로그아웃(logout_ok.jsp)
실패 로그인 폼
실패
(되돌아감)
로그인 폼

login_form.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인</title>
</head>
<body>

<!-- login_form.jsp -->
<form action="login_ok.jsp" method="post">
아이디 <input type="text" name="id"  />
비밀번호 <input type="password" name="password" />
<input type="submit" value="로그인" />
</form>

</body>
</html>

login_ok.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	// login_form.jsp
	request.setCharacterEncoding("utf-8");
	
	String id = request.getParameter("id");
	String password = request.getParameter("password");
	
	// 실제 id, p/w
	// 게시판 select
	String save_id = "tester";
	String save_password = "123456";
	
	
	// 0 :성공 1 : 비밀번호 오류 2 : 기타 오류
	int flag = 2;
	if(save_id.equals(id) && save_password.equals(password)) {
		flag = 0;
	} else { 
		flag = 1;
	}
	
	out.println("<script type='text/javascript'>");
	if(flag == 0){
		// session
		// 민감한 개인정보 입력 금지
		session.setAttribute("sid", id);
		session.setAttribute("sgrade", "A");
		
		out.println("alert('로그인 완료')");
		out.println("location.href='login_complete.jsp'");
		
	} else if(flag == 1) {
		out.println("alert('비밀번호 오류');");
		out.println("history.back();");
		
	} else if(flag == 2) {
		out.println("alert('기타 오류');");
	}
	out.println("</script>");
%>

login_complete.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	int flag = 1;
	if(session.getAttribute("sid") != null && session.getAttribute("sgrade") != null ) {
		flag = 0;
	}
	
	if(flag == 0) {
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
login_complete.jsp<br>
<a href="logout_ok.jsp">로그아웃</a>
</body>
</html>
<%		
	} else if(flag == 1) {
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<script type="text/javascript">
		alert('로그인 필요');
		location.href='login_form.jsp';
	</script>
</body>
</html>
<%		
	}
%>

logout_ok.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	// logout_ok.jsp
	session.invalidate();
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<script type="text/javascript">
		alert('로그아웃 완료');
		location.href='login_form.jsp';
	</script>
</body>
</html>

JDBC를 통해 로그인 하기

테이블 구성

번호			seq			int				not null primary key auto_increment
아이디		id			varchar(12)		not null
비밀번호		password	varchar(12)		not null
이름			name		varchar(12)		not null
이메일		mail		varchar(50)
등급			grade		char(1)			not null
등록일		wdate		datetime		not null

테이블 생성

create table member1(
seq int not null primary key auto_increment,
id varchar(12) not null,
password varchar(12) not null,
name varchar(12) not null,
mail varchar(50),
grade char(1) not null,
wdate datetime not null
);

테이블 추가

insert into member1 values ( 0, 'tester', '1234', '이름', 'test@test.com', 'A', now() );

login_ok.jsp 부분만 바꿔준다.

!comtext.xml과 라이브러리 추가는 기본

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="javax.naming.Context" %>
<%@ page import="javax.naming.InitialContext" %>
<%@ page import="javax.naming.NamingException" %>

<%@ page import="javax.sql.DataSource" %>

<%@ page import="java.sql.Connection" %>
<%@ page import="java.sql.PreparedStatement" %>
<%@ page import="java.sql.ResultSet" %>
<%@ page import="java.sql.SQLException" %>
<%
	// login_ok.jsp
	request.setCharacterEncoding("utf-8");
	
	// id p/w 가져오기
	String id = request.getParameter("id");
	String password = request.getParameter("password");
	
	// db연동
	Connection conn = null;
	PreparedStatement pstmt = null;
	ResultSet rs = null;
	
	// 0 :성공 1 : 비밀번호 오류 2 : 기타 오류
	int flag = 2;
	
	try {
		
		Context initCtx = new InitialContext();
		Context envCtx = (Context)initCtx.lookup( "java:comp/env" );
		
		DataSource dataSource = (DataSource)envCtx.lookup( "jdbc/mariadb2" );
		
		conn = dataSource.getConnection();
		
		// select문
		// count(*) - id 중복검사 ...
		// name, mail, grade => session
		String sql = "select name, mail, grade from member1 where id=? and password=?";
		
		pstmt=conn.prepareStatement(sql);
		pstmt.setString(1, id);
		pstmt.setString(2, password);
		
		rs = pstmt.executeQuery();
		
		if(rs.next()) {
			flag = 0;
			
			// session
			session.setAttribute("sid", id);
			session.setAttribute("sname", rs.getString("name"));
			session.setAttribute("smail", rs.getString("mail"));
			session.setAttribute("sgrade", rs.getString("grade"));
		} else {
			flag = 1;
		}
		
	} catch( NamingException e ) {
		System.out.println( "[에러] " + e.getMessage() );
	} catch( SQLException e ) {
		System.out.println( "[에러] " + e.getMessage() );
	} finally {
		if( conn != null ) pstmt.close();
		if( pstmt!= null ) conn.close();
		if( rs != null ) pstmt.close();
	}
	
	out.println("<script type='text/javascript'>");
	
	if(flag == 0){
		out.println("alert('로그인 완료');");
		out.println("location.href='login_complete.jsp'");
		
	} else if(flag == 1) {
		out.println("alert('비밀번호 오류');");
		out.println("history.back();");
		
	} else if(flag == 2) {
		out.println("alert('기타 오류');");
	}
	
	out.println("</script>");
%>

+아이디 중복검사
+아이디/비밀번호 찾기

쿠키를 이용한 로그인

login_form.jsp는 그대로 사용한다.

login_ok.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	request.setCharacterEncoding("utf-8");
	
	String id = request.getParameter("id");
	String password = request.getParameter("password");
	
	String save_id = "tester";
	String save_password = "123456";
	
	
	// 0 :성공 1 : 비밀번호 오류 2 : 기타 오류
	int flag = 2;
	if(save_id.equals(id) && save_password.equals(password)) {
		flag = 0;
	} else { 
		flag = 1;
	}
	
	out.println("<script type='text/javascript'>");
	if(flag == 0){
		Cookie cookie1 = new Cookie("login_id", id);
		Cookie cookie2 = new Cookie("login_grade", "A");
		response.addCookie(cookie1);
		response.addCookie(cookie2);
		
		out.println("alert('로그인 완료')");
		out.println("location.href='login_complete.jsp'");
		
	} else if(flag == 1) {
		out.println("alert('비밀번호 오류');");
		out.println("history.back();");
		
	} else if(flag == 2) {
		out.println("alert('기타 오류');");
	}
	out.println("</script>");
%>

login_complete.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	int flag = 1;
	// 쿠키 검사 
	Cookie[] cookies = request.getCookies();
	if(cookies != null && cookies.length >= 0) {
		for(int i=0; i<cookies.length; i++) {
			if(cookies[i].getName().equals("login_id") && !cookies[i].getValue().equals("")) {
				flag = 0;
				break;
			}
		}
	}
	
	if(flag == 0) {
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
login_complete.jsp<br>
<a href="logout_ok.jsp">로그아웃</a>
</body>
</html>
<%		
	} else if(flag == 1) {
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<script type="text/javascript">
		alert('로그인 필요');
		location.href='login_form.jsp';
	</script>
</body>
</html>
<%		
	}
%>

logout_ok.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	Cookie cookie1 = new Cookie("login_id", "");
	Cookie cookie2 = new Cookie("login_grade", "");
	cookie1.setMaxAge(0);
	cookie2.setMaxAge(0);
	response.addCookie(cookie1);
	response.addCookie(cookie2);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<script type="text/javascript">
		alert('로그아웃 완료');
		location.href='login_form.jsp';
	</script>
</body>
</html>

EL(Expression Language)

기본출력

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
	out.println("1<br>");
%>
<%="2" %><br><hr>
<!-- EL -->
${3 }<br>
${"4"}<br>
${one}<br>
${"two"}<br>
${'three'}<br>
\${'four'}<br>
</body>
</html>



사칙연산

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
${2 + 5}<br>
${2 div 5}<br>
${2 mod 5}<br>
<hr>
${"2" + 5}<br>
${"2" + "5"}<br>
${"2"}${"5"}<br>
\${"이" + "5"}<br>
${"이"}${"5"}<br>
</body>
</html>



연산자 비교

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
${2 < 9}<br>
${2 lt 9}<br>
${empty data}<br>
${(2 < 9) ? "작다":"크다"}<br>
</body>
</html>



jsp방식와 EL방식

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
	String name1 = "박";
	pageContext.setAttribute("name2", "효");
%>
<%=name1 %><br>
${name1 }<br> // 설정된 값이 없기 때문에 공백처리된다.
<hr>
<%=pageContext.getAttribute("name2") %><br>
${pageScope.name2 }<br>
${pageScope['name2'] }<br>
${name2 }<br>
</body>
</html>



내장객체

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
	pageContext.setAttribute("name1", "김");
	request.setAttribute("name2", "나");
	session.setAttribute("name3", "박");
	application.setAttribute("name4", "이");
	
	// page -> request -> session 순서로 넘어간다
	//pageContext.setAttribute("name", "김");
	//request.setAttribute("name", "나");
	session.setAttribute("name", "박");
%>
${pageScope.name1 }<br>
${requestScope.name2 }<br>
${sessionScope.name3 }<br>
${applicationScope.name4 }<br>
<br>
${name1 }<br>
${name2 }<br>
${name3 }<br>
${name4 }<br>
<br>
${name }<br>
</body>
</html>



객체와 배열방식

객체

package model1;

public class BoardTO {
	private String subject;
	private String writer;
	
	public String getSubject() {
		System.out.println("getSubject() 호출");
		return subject;
	}
	public void setSubject(String subject) {
		this.subject = subject;
	}
	public String getWriter() {
		System.out.println("getWriter() 호출");
		return writer;
	}
	public void setWriter(String writer) {
		this.writer = writer;
	}

}

el.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.util.ArrayList" %>
<%@ page import="model1.BoardTO" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
	BoardTO to = new BoardTO();
	to.setSubject("제목");
	to.setWriter("작성자");
	
	BoardTO to1 = new BoardTO();
	to1.setSubject("제목1");
	to1.setWriter("작성자1");
	
	BoardTO to2 = new BoardTO();
	to2.setSubject("제목2");
	to2.setWriter("작성자2");
	
	//BoardTO[] lists = {to1, to2};
	ArrayList<BoardTO> lists = new ArrayList();
	lists.add(to1);
	lists.add(to2);
	
	//pageContext.setAttribute("to", to);
	//request.setAttribute("to", to);
	request.setAttribute("lists", lists);
%>
${to.subject }<br>
${to.writer }<br>
<br>
<!-- 배열, ArrayList 상관없이 출력 가능하다 -->
subject : ${lists[0].subject }<br>
subject : ${lists[0].writer }<br>
subject : ${lists[1].subject }<br>
subject : ${lists[1].writer }<br>
subject : ${lists[2].subject }<br>
</body>
</html>



객체방식

package model1;

import java.util.ArrayList;

public class BoardListTO {
	private String cpage;
	private BoardTO boardTO;
	private ArrayList<BoardTO> boardLists;
	
	public String getCpage() {
		return cpage;
	}
	public void setCpage(String cpage) {
		this.cpage = cpage;
	}
	public BoardTO getBoardTO() {
		return boardTO;
	}
	public void setBoardTO(BoardTO boardTO) {
		this.boardTO = boardTO;
	}
	public ArrayList<BoardTO> getBoardLists() {
		return boardLists;
	}
	public void setBoardlists(ArrayList<BoardTO> boardLists) {
		this.boardLists = boardLists;
	}

}
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="model1.BoardTO" %>
<%@ page import="model1.BoardListTO" %>
<%@ page import="java.util.ArrayList" %>
<%
	BoardTO to1 = new BoardTO();
	to1.setSubject("제목1");
	to1.setWriter("작성자1");
	
	BoardTO to2 = new BoardTO();
	to2.setSubject("제목2");
	to2.setWriter("작성자2");
	
	BoardListTO listTO1 = new BoardListTO();
	listTO1.setCpage("1");
	listTO1.setBoardTO(to1);
	
	BoardListTO listTO2 = new BoardListTO();
	listTO2.setCpage("2");
	listTO2.setBoardTO(to2);
	
	ArrayList<BoardListTO> lists = new ArrayList();
	lists.add(listTO1);
	lists.add(listTO2);
	
	pageContext.setAttribute("lists", lists);
	
	// el을 통해서 데이터에 접근
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
${lists[0].cpage}<br>
${lists[1].cpage}<br><br>

${lists[0].boardTO.subject}<br>
${lists[0].boardTO.writer}<br>
${lists[1].boardTO.subject}<br>
${lists[1].boardTO.writer}<br>
</body>
</html>

정보 출력

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
	// 브라우저 정보
	out.println("user-agent : " + request.getHeader("user-agent") + "<br>" + "<br>");
%>
host : ${header['host'] }<br><br>
user-agent : ${header['user-agent'] }<br><br>
<br>
header : ${header }<br><br>
<br>
requestURI : ${pageContext.request.requestURI }<br><br>
remotAddr : ${pageContext.request.remoteAddr }<br>
</body>
</html>

JSTL

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- EL -->
EL : ${"browser" }<br>
<!-- JSTL -->
JSTL : <c:out value="browser"></c:out><br><br>
<%
	pageContext.setAttribute("data", "browser");
%>
EL : ${data }<br>
JSTL : <c:out value="${data}"></c:out><br>
JSTL : <c:out value="${data1}" default="nobrowser"></c:out><br>
</body>
</html>

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<c:set var="data1" value="value1" />
<c:set var="data2" value="value2" scope="page" />
<c:set var="data3"> value3</c:set>

data1 : <c:out value="${data1 }" /><br>
data2 : <c:out value="${data2 }" /><br>
data3 : <c:out value="${data3 }" /><br>
data1 : <c:out value="data1" /><br>

<hr>

<c:set var="data" value="value1" scope="page" />
<c:set var="data" value="value2" scope="request" />
<c:set var="data" value="value3" scope="session" />

${pageScope.data }<br>
${requestScope.data }<br>
${sessionScope.data }<br>
</body>
</html>

0개의 댓글