[Server] TIL no.46 | 로그인 과정 (2023.09.22)

유은서·2023년 9월 22일
0

Server

목록 보기
6/6

1. 로그인 과정

  • jsp
  • java

1-1) JSP

1) 메인 jsp

<%@ 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>

<link rel="stylesheet" href="/resources/css/main-style.css">

<!-- fontaswesom 아이콘 사용할 수 있는 스크립트 연결-->
<script src="https://kit.fontawesome.com/ac58eafae7.js"
	crossorigin="anonymous"></script>
</head>
<body>
	<%-- 시멘틱태그 html 가져옴 --%>
	<main>

		<%-- hedaer.jsp추가 --%>

		<%-- <jsp:include page = "jsp파일경로" />
				- jsp 파일 경로는 webapp 폴더 기준으로 작성
				- JSP 액션 태그(jsp에 기본 내장됨)
				- 다른 jsp  파일의 코드를 현재 위치에 추가 
			 --%>

		<jsp:include page="/WEB-INF/views/common/header.jsp" />



		<section class="content">
			
			
			<section class="content-1">
				<h3>로그인된 회원 정보</h3>
			</section>



			<!-- 아이디/비밀번호/로그인 버튼 영역 -->
			<section class="content-2">

				<c:choose>
					<%--로그인이 안되었을 때  --%>
					<%-- EL empty : 비어있거나 null이면 true --%>
				 <c:when test="${empty sessionScope.loginMember}">
						<form action="/member/login" method = "post" name="login-form" id="loginFrm">

							<fieldset class="id-pw-area">
								
								<section>
									<input type="text" name="inputEmail" placeholder="이메일">
									<input type="password" name="inputPw" placeholder="비밀번호">

								</section>
								
								<section>
									<button>로그인</button>
								</section>
								
							</fieldset>

							<label> 
								<input type="checkbox" name="saveId"> 아이디 저장
							</label>

							<!-- 회원가입 / Id / Pw 찾기 영역 -->
							<section class="signup-find-area">
								<a href="#">회원가입</a> <span>|</span> <a href="#">ID/PW 찾기</a>
							</section>

						</form>
					</c:when>
					
					<%--로그인이 되었을 때  --%>
					<c:otherwise>
						<artice class="login-area"> 
							<a href ="#"> 
								<img src="/resources/images/user.png" id = "memberProfile">
							</a>

							<div class="my-info">
								<div>
									<a href="#"  id="nickname">${sessionScope.loginMember.memberNickName}</a> 
									<a href="/member/logout" id="logoutBtn">로그아웃</a>
								</div>
	
								<p></p>
							</div>
						</artice>
					</c:otherwise>		
				</c:choose>
			</section>
		</section>
	</main>
	<jsp:include page="/WEB-INF/views/common/footer.jsp" />
</body>
</html>

1-2) JAVA

=> 로그인 시, action = "/member/login" method = "post" name="login-form" 으로 받으므로
=> member/login을 가진 웹 시작

1) Controller

@WebServlet("/member/login")
public class LoginController extends HttpServlet {
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

		try {
			// 인코딩 처리
			req.setCharacterEncoding("UTF-8");
			
			// 파라미터 얻어오기
			String inputEmail = req.getParameter("inputEmail");
			String inputPw = req.getParameter("inputPw");
			
			
			//서비스 객체 생성 
			MemberService service = new MemberService();
			
			//로그인 서비스 호출 후 결과 반환받기
			Member loginMember = service.login(inputEmail,inputPw);
			
			
			//Session 객체 생성
			HttpSession session = req.getSession();
			
			if(loginMember!= null) { // 로그인 성공
				
				// session에 로그인한 회원 정보를 추가
				session.setAttribute("loginMember", loginMember);
				
				// session 만료 시간 지정 (초단위 지정)
				 session.setMaxInactiveInterval(60*60);
					 
				 resp.sendRedirect("/"); // 메인 페이지 재요청 ( 이거때문에 메인페이지로 다시 돌아옴  원래는 버튼 누르면 /member/login으로 이동했어야 함

			}else { // 실패
				
				// 로그인 실패 메시지를 session에 추가
				session.setAttribute("message", "아이디 또는 비밀번호가 일치하지 않습니다.");
				
				// 현재 요청 이전 페이지로 redirect
				String referer = req.getHeader("referer");
				
				System.out.println(referer);
				resp.sendRedirect(referer);
				
			}
			
		}catch(Exception e) {
			
			e.printStackTrace();
		}
	}
}

=> session에 저장

=> 로그인이 진행되지 않는 경우엔 뒤로 돌리기(referer)이용!

2. 로그아웃 과정

  • jsp (위에와 동일)
  • java

=> 로그아웃 시, "/member/logout"으로 받는 웹 페이지를 새로 시작해야하지만,
=> 로그아웃 시, 새로 출력 할 창은 필요하지 않으므로
=> resp.senRedirect("/")를 이용하여 메인페이지로 다시 이동할 수 있게 함.

1) Controller

@WebServlet("/member/logout")
public class LogoutController  extends HttpServlet{

	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

		// HttpSession을 얻어와
		
		HttpSession session = req.getSession();
		
		// Session을 무효화 하고 
		session.invalidate();
		
		
		// 메인페이지를 재요청(redirect)
		resp.sendRedirect("/");
		
	}
}

3. 검색결과 가져오기

  • 메인 jsp (위에와 동일)
  • 검색결과 jsp
  • java
  • sql

3-1) JAVA

=> 메인 jsp의 header에서 검색창의 정보는 id = "query" name = "query" 이고
제출할 곳은 action = "/search" method="get" 임
=> /search 을 가진 웹 시작

1) Controller

@WebServlet("/search")
public class SearchController extends HttpServlet{

	SearchMemberService service = new SearchMemberService();

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("서비스 확인");

		try {
			String nickName = req.getParameter("query");

			List<Member> mem = service.searchmem(nickName);
			req.setAttribute("mem", mem);
			req.setAttribute("query", nickName);

		}catch(Exception e){

			e.printStackTrace();
		}
		req.getRequestDispatcher("/WEB-INF/views/new/search.jsp").forward(req, resp);
	}

}

2) Service

public class SearchMemberService {

	private SearchMemberDAO dao = new SearchMemberDAO();


	public List<Member> searchmem(String nickName) throws Exception{
		Connection conn = getConnection();
		
		List<Member> listMem = dao.searchMem(conn,nickName );
		
		 System.out.println("서비스 완료?");

		
		close(conn);
		
		return listMem;
	}
	
}

3) DAO

public class SearchMemberDAO {

	private Statement stmt;
	private PreparedStatement pstmt;
	private ResultSet rs;
	
	private Properties prop;
	
	public SearchMemberDAO() {
		
		try {
			String filePath = MemberDAO.class.getResource("/edu/kh/project/sql/member-sql.xml").getPath();
			
			prop = new Properties();
			
			prop.loadFromXML(new FileInputStream(filePath));
			
		}catch(Exception e){
			e.printStackTrace();
		}

	}
	
	
	
	public List<Member> searchMem(Connection conn, String nickName) throws Exception{
		
		List<Member>memList = new ArrayList<Member>();
		
		try {
			
			String sql = prop.getProperty("searchMem");
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, nickName);
			
			rs = pstmt.executeQuery();
			
			
			while(rs.next()) {
				
				
				 //몇 개만 받아오는 경우 이렇게 작성할 것!!  
 				 Member member = new Member();
				 member.setMemberNo(rs.getInt("MEMBER_NO"));
				 member.setMemberEmail(rs.getString("MEMBER_EMAIL"));
				 member.setMemberNickName(rs.getString("MEMBER_NICKNAME"));
				 member.setMemberTel(rs.getString("MEMBER_TEL"));
				
				 memList.add(member);
				 
				 System.out.println("여기까지 완료?");
			}
			
		}finally {
			
			close(rs);
			close(pstmt);
			
		}
	
		return memList;
	}
	
}

3-2) sql

	<entry key = "searchMem">
	SELECT MEMBER_NO, MEMBER_EMAIL, MEMBER_NICKNAME, MEMBER_TEL
	FROM "MEMBER"  
	WHERE MEMBER_DEL_FL ='N'
	AND MEMBER_NICKNAME LIKE '%'||?||'%'
	</entry>

3-3) JSP

1) 검색 결과 jsp

<%@ 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>회원 검색 결과 </title>

		<link rel="stylesheet" href="/resources/css/main-style.css">

		<script src="https://kit.fontawesome.com/ac58eafae7.js" crossorigin="anonymous"></script>
	</head>
	<body>

		<main>
			<jsp:include page="/WEB-INF/views/common/header.jsp" />

			<section class = "search-page">
				<h1>'${query}'로 검색한결과</h1>

				<c:choose>

				 <%-- ★★★★★★★memberList가 비어있을 때 (근데, ''값 오면 빈값으로 들어옴??  --%>
					<%--<c:when test = "${empty requestScope.mem}"> --%>
					<c:when test = "${query == '' || empty requestScope.mem }">
						<p>검색된 회원이 없습니다.</p>
					</c:when>

					<c:otherwise>
						<c:forEach var = "member" items = "${mem}">
								<div class = "search-div">
									닉네임 : ${member.memberNickName} <br>
									<%-- var.필드명 --%>

									이메일 : ${member.memberEmail} <br>

									전화번호 : ${member.memberTel}<br>								

								</div>
						</c:forEach>
					</c:otherwise>
				</c:choose>
			</section>

		</main>

		<jsp:include page="/WEB-INF/views/common/footer.jsp" />

	</body>
</html>

+ ) 검색결과가 없습니다

<c:when test = "${query == '' || empty requestScope.mem }">

로 조건 잡기!
query 즉, 검색 창에 빈값이 있는 경우 혹은
mem 값에 검색결과를 가져오지 못한경우를 파악


  1. 이전 페이지 이동
    => referer => 각 페이지 방문 시 남는 흔적
    즉, reequest.getHeader(): 안에 파라미터로 referer 전달 시 이전페이지 주소값 반환

  2. 리스트 값 얻어오기
    => jsp의 forEach값 이용해서 객체에 접근하기.

0개의 댓글