📗 self-study/📗 KH정보교육원 당산지원

[Spring] EL구문을 활용 - 아이디 저장 쿠키

천재강쥐 2022. 11. 29. 12:02

 

 

 

🔥 아이디 저장 쿠키 기능 🔥

✔️ Spring_Project에서 진행함

 

 

 

📌 현재 상황

👉🏻 아이디 저장... 원츄

 

 

 

💻 header.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>Document</title>
    
    <!-- Alertify 라이브러리 -->
    <!-- JavaScript -->
	<script src="//cdn.jsdelivr.net/npm/alertifyjs@1.13.1/build/alertify.min.js"></script>
	<!-- CSS -->
	<link rel="stylesheet" href="//cdn.jsdelivr.net/npm/alertifyjs@1.13.1/build/css/alertify.min.css"/>
	<!-- Default theme -->
	<link rel="stylesheet" href="//cdn.jsdelivr.net/npm/alertifyjs@1.13.1/build/css/themes/default.min.css"/>
	<!-- Semantic UI theme -->
	<link rel="stylesheet" href="//cdn.jsdelivr.net/npm/alertifyjs@1.13.1/build/css/themes/semantic.min.css"/>
    
    <!-- jQuery 라이브러리 -->
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
    <!-- 부트스트랩에서 제공하고 있는 스타일 -->
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
    <!-- 부트스트랩에서 제공하고 있는 스크립트 -->
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
    <style>
        div {box-sizing:border-box;}
        #header {
            width:80%;
            height:100px;
            padding-top:20px;
            margin:auto;
        }
        #header>div {width:100%; margin-bottom:10px;}
        #header_1 {height:40%;}
        #header_2 {height:60%;}

        #header_1>div{
            height:100%;
            float:left;
        }
        #header_1_left {width:30%; position:relative;}
        #header_1_center {width:40%;}
        #header_1_right {width:30%;}

        #header_1_left>img {height:80%; position:absolute; margin:auto; top:0px; bottom:0px; right:0px; left:0px;}
        #header_1_right {text-align:center; line-height:35px; font-size:12px; text-indent:35px;}
        #header_1_right>a {margin:5px;}
        #header_1_right>a:hover {cursor:pointer;}

        #header_2>ul {width:100%; height:100%; list-style-type:none; margin:auto; padding:0;}
        #header_2>ul>li {float:left; width:25%; height:100%; line-height:55px; text-align:center;}
        #header_2>ul>li a {text-decoration:none; color:black; font-size:18px; font-weight:900;}

        #header_2 {border-top:1px solid lightgray;}

        #header a {text-decoration:none; color:black;}

        /* 세부페이지마다 공통적으로 유지할 style */
        .content {
            background-color:rgb(247, 245, 245);
            width:80%;
            margin:auto;
        }
        .innerOuter {
            border:1px solid lightgray;
            width:80%;
            margin:auto;
            padding:5% 10%;
            background-color:white;
        }

    </style>
</head>
<body>

	<!-- 액션 태그의 특징: script 태그 영역 내부에서 사용할 수 없음 (인식 안 됨) -->
	<c:if test="${ not empty alertMsg }">
		<script>
			// alert("${ alertMsg }");
			alertify.alert("서비스 성공", "${ alertMsg }");
		</script>
		<c:remove var="alertMsg" scope="session" />
	</c:if>
	
    <div id="header">
        <div id="header_1">
            <div id="header_1_left">
                <img src="https://www.iei.or.kr/resources/images/common/top_logo_s.jpg" alt="">
            </div>
            <div id="header_1_center"></div>
            <div id="header_1_right">          
                <c:choose>
                	<c:when test="${ empty loginUser }">
		                <!-- 로그인 전 -->
		                <a href="enrollForm.me">회원가입</a>
		                <a data-toggle="modal" data-target="#loginModal">로그인</a>
		                <!-- 모달의 원리 : 이 버튼 클릭시 data-targer에 제시되어있는 해당 아이디의 div요소를 띄워줌 -->
                	</c:when>
                	<c:otherwise>            	                
		                <!-- 로그인 후 -->
	                    <label>${ loginUser.userName }님 환영합니다</label> &nbsp;&nbsp;
	                    <a href="myPage.me">마이페이지</a>
	                    <a href="logout.me">로그아웃</a>
                	</c:otherwise>
                </c:choose>
            </div>
        </div>
        <div id="header_2">
            <ul>
                <li><a href="">HOME</a></li>
                <li><a href="">공지사항</a></li>
                <li><a href="list.bo">자유게시판</a></li>
                <li><a href="">사진게시판</a></li>
            </ul>
        </div>
    </div>

    <!-- 로그인 클릭 시 뜨는 모달 (기존에는 안보이다가 위의 a 클릭 시 보임) -->
    <div class="modal fade" id="loginModal">
        <div class="modal-dialog modal-sm">
            <div class="modal-content">
                <!-- Modal Header -->
                <div class="modal-header">
                    <h4 class="modal-title">Login</h4>
                    <button type="button" class="close" data-dismiss="modal">&times;</button>
                </div>
        
                <form action="login.me" method="post">
                    <!-- Modal body -->
                    <div class="modal-body">
                        <label for="userId" class="mr-sm-2">ID : </label>
                        <input type="text" class="form-control mb-2 mr-sm-2" placeholder="Enter ID" id="userId" name="userId" required> <br>
                        <label for="userPwd" class="mr-sm-2">Password : </label>
                        <input type="password" class="form-control mb-2 mr-sm-2" placeholder="Enter Password" id="userPwd" name="userPwd" required>
                        <br>
                        <!-- 아이디 저장 체크박스 -->
                        <input type="checkbox" id="saveId" name="saveId" value="y"><label for="saveId">아이디 저장</label>
                    </div>
                           
                    <!-- Modal footer -->
                    <div class="modal-footer">
                        <button type="submit" class="btn btn-primary">로그인</button>
                        <button type="button" class="btn btn-danger" data-dismiss="modal">취소</button>
                    </div>
                </form>
            </div>
        </div>

    </div>
    
    <br clear="both">
</body>
</html>

👉🏻 모양을 만들어 주었습니다

 

 

 

❗️ 로직 생각해 보기

👉🏻 요청 시 전달값 중에 saveId가 y라면 saveId라는 키값으로 현재 아이디값으로 쿠키 생성
👉🏻 요청 시 전달값 중에 saveId가 y가 아니라면 쿠키 삭제

 

 

 

💻 MemberController

👉🏻 기존 메소드에서 saveId를 매개변수로 추가로 받아 줌

👉🏻 쿠키를 응답 데이터로 넘기기 위해 HttpServletResponse까지 매개변수로 받음

👉🏻 넘어온 saveId에 대한 값이 y인지 아닌지 판별하여 쿠키 생성/삭제

public ModelAndView loginMember(Member m, ModelAndView mv, HttpSession session,
				String saveId, HttpServletResponse response) {
		
		if(saveId != null && saveId.equals("y")) {
			// 요청 시 전달값 중에 saveId가 y라면 saveId라는 키값으로 현재 아이디값을 쿠키 생성
			// 새로 만든 쿠키의 saveId라는 키값에 m.getUserId()로 받아온 값을 밸류로 넣겠다
			Cookie cookie = new Cookie("saveId", m.getUserId());
			cookie.setMaxAge(24 * 60 * 60 * 1); // 1초 단위, 유효기간 1일
			response.addCookie(cookie);
			
		} else {
			// 요청 시 전달값 중에 saveId가 y가 아니라면 쿠키 삭제
			// 쿠키는 삭제 구문이 없으나 같은 키값으로 유효기간을 0일로 지정해서 덮어씌우면 삭제 효과를 볼 수 있음!
			Cookie cookie = new Cookie("saveId", m.getUserId());
			cookie.setMaxAge(0); // 쿠키 삭제와 같은 의미
			response.addCookie(cookie);

		}
        
        // 여기서부터는 loginMember 메소드에 기존 존재하던 코드임
        
        Member loginUser = memberService.loginMember(m); // 그대로 호출

		if(loginUser != null &&
				bcryptPasswordEncoder.matches(m.getUserPwd(), loginUser.getUserPwd())) {

			session.setAttribute("loginUser", loginUser);
			session.setAttribute("alertMsg", "로그인에 성공했습니다.");
						
			mv.setViewName("redirect:/");
			
		} else { // 일치하지 않는다면 => 로그인 실패
			
			mv.addObject("errorMsg", "로그인 실패");
			
			mv.setViewName("common/errorPage");
		}
		
		return mv;
	}

 

 

 

❗️ 쿠키의 value값을 Controller에서 jsp로 가지고 오는 법

👉🏻 ${ cookie이름.키값.value }

 

 

 

❗️ 쿠키의 유무 검사

👉🏻 ${ not empty cookie이름.키값 }

 

 

 

💻 header.jsp

👉🏻 Controller에서 가지고 온 cookie의 밸류를 뿌려 주기

👉🏻 만약 쿠키가 있다면 아이디 저장칸에 체크된 상태로 보여 주기

<!-- Modal body -->
<div class="modal-body">
    <label for="userId" class="mr-sm-2">ID : </label>
    <input type="text" class="form-control mb-2 mr-sm-2" placeholder="Enter ID" id="userId" name="userId" value="${ cookie.saveId.value }" required> <br>
    <label for="userPwd" class="mr-sm-2">Password : </label>
    <input type="password" class="form-control mb-2 mr-sm-2" placeholder="Enter Password" id="userPwd" name="userPwd" required>
    <br>

    <c:choose>
        <c:when test="${ not empty cookie.saveId }">
            <!-- 만약 saveId라는 쿠키가 있다면: 체크박스 체크된 상태 -->
             <!-- 아이디 저장 체크박스 -->
            <input type="checkbox" id="saveId" name="saveId" value="y" checked><label for="saveId">아이디 저장</label>
        </c:when>
        <c:otherwise>
            <!-- 만약 saveId라는 쿠키가 없다면: 체크박스 체크되지 않은 상태 -->
            <input type="checkbox" id="saveId" name="saveId" value="y"><label for="saveId">아이디 저장</label>
        </c:otherwise>
    </c:choose>

</div>

 

 

 

📌 현재 상황

👉🏻 아이디 저장 체크박스 후 로그인

 

👉🏻 로그인 완료

 

👉🏻 로그아웃

 

👉🏻 다시 로그인 모달창에 접속해 보면 ID 값이 남아 있음!