자바(JAVA)/JSP 웹 프로그래밍 공부 (성낙현의 JSP 자바 웹 프로그래밍 참고)

JAVA/JSP 11. 쿠키(Cookie) - 레이어 팝업창 제어

개발학생 2023. 5. 27. 23:25
반응형

*팝업창

  • 쿠키로 구현 가능한 기능
  • 웹 애플리케이션에서 회원가입 시 아이디 중복 체크나 간단한 공지사항을 띄워주는 용도로 자주 사용
    → 과거에는 별도 URL을 가지는 ‘팝업창’을 주로 사용하였으나, 불법 광고 홍보에 많이 악용되어.. 최근에는 레이어를 이용한 형태의 팝업 추로 사용
  • 레이어 형태 팝업창의 동작 예시 (예시 이미지: ebsi 홈페이지)
     → 처음 방문 시 팝업 공지가 팝업창으로 뜨며, [닫기]를 누르면 사라짐
    → [오늘 하루 열지 않기]를 체크하지 않은 채로 [닫기]를 했다면 새로고침 시 다시 나타남, [오늘 하루 열지 않기]를 체크한 후 닫는다면 하루 동안은 새로고침해도 팝업 공지가 나타나지 않음
    (ebsi 홈페이지의 경우, [1일 동안 열지 않기]를 누르면 바로 팝업창이 닫히고, 하루 동안은 새로고침해도 팝업 공지가 나타나지 않음)

 

*ebsi 홈페이지의 팝업창

 

(1) ebsi 홈페이지의 팝업창에서 [닫기] 클릭 후 → [F5]키로 홈페이지 새로고침

- 다시 팝업창이 뜸

(2) 홈페이지의 팝업창에서 [1일동안 열지 않기] 클릭 후 → [F5]키로 홈페이지 새로고침

- 다시 팝업창이 뜨지 않음

 

1. 쿠키 없이 기본 기능 구현하기

쿠키를 사용하지 않아, 체크 여부가 아무런 효과가 없는 페이지 (HTML5, CSS3, 자바스크립트, jQuery 코드로 최소한의 기능을 하는 팝업창 구현)

//PopupMain.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
String popupMode = "on";    //1.레이어 팝업창 띄울 지 여부
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>쿠키를 이용한 팝업 관리 ver 0.1</title>

//2. CSS로 레이어 팝업창 위치 지정
<style>
    div#popup {
        position: absolute; top:100px; left:50px; color:yellow;  
        width:270px; height:100px; background-color:gray;
    }
    div#popup>div {
        position: relative; background-color:#ffffff; top:0px;
        border:1px solid gray; padding:10px; color:black;
    }
</style>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>

//3.<script> 태그 전체
<script>
$(function() {
    $('#closeBtn').click(function() {    //4.닫기 버튼(id="clodsBtn")을 누르면
        $('#popup').hide();    //5.팝업창(id="popup")을 숨김 처리 
    });
});
</script>
</head>
<body>
<h2>팝업 메인 페이지(ver 0.1)</h2>
<%
    for (int i = 1 ; i <= 10 ; i++) { 
        out.print("현재 팝업창은 " + popupMode + " 상태입니다.<br/>");
    }
		
		//6.popupMode 값이 "on"일 때만 팝업창 표시
    if (popupMode.equals("on")) {    
%>
    <div id="popup">    //7.공지사항 팝업 화면
        <h2 align="center">공지사항 팝업입니다.</h2>
        <div align="right"><form name="popFrm">
            <input type="checkbox" id="inactiveToday" value="1" />    //8.체크박스
            하루 동안 열지 않음
            <input type="button" value="닫기" id="closeBtn" />    //9.닫기 버튼
        </form></div>
    </div>
<%
    }
%>
</body>
</html>
  1. popupMode는 레이어 팝업창을 띄울지 알려주는 변수
  2. 팝업창의 위치와 색상 등의 형태를 지정하는 CSS
  3. jQuery를 이용하는 자바스크립트 코드
  4. id가 closeBtn인 요소를 클릭하면 실행됨
  5. 팝업창을 숨김 처리
  6. 1.의 변수 popupMode 값이 “on”이면 팝업창을 보여줌
  7. 공지사항 팝업창의 HTML 코드
  8. [하루 동안 열지 않음] 체크박스
  9. [닫기]버튼

 

2. 쿠키를 이용해 상태 정보 유지하기

1) 1.에서 구현한 팝업창에 쿠키 기능을 추가하여, 제대로 동작할 수 있도록 하기

//PopupMain.jsp에 코드 추가

...

String popupMode = "on";

//추가한 코드
//1.쿠키를 읽어 popubMode 값 설정
Cookie[] cookies = request.getCookies();
if (cookies != null) {
    for (Cookie c : cookies) {
        String cookieName = c.getName();
        String cookieValue = c.getValue();
        if (cookieName.equals("PopupClose")) {    //2."PopupClose" 쿠키가 존재하면
            popupMode = cookieValue;     //3.popupMode의 값 갱신
        }
    }
} 
%>

...
$(function() {
    $('#closeBtn').click(function() {    //4.닫기 버튼을 누르면 실행되는 함수
        $('#popup').hide();
				
				//추가한 코드2
        var chkVal = $("input:checkbox[id=inactiveToday]:checked").val();    //5.체크 여부
        
				//6.jQuery의 ajax() 함수로 비동기 요청 
				$.ajax({
            url : './PopupCookie.jsp',
            type : 'get',
            data : {inactiveToday : chkVal},
            dataType : "text",
            success : function(resData) {    //7.요청 성공 시 호출되는 함수
                if (resData != '') location.reload();
            }
        });
    });
});
...
  1. 쿠키를 읽어 popubMode 값 설정
  2. 이름이 “PopupClose”인 쿠키가 존재하는지 여부 체크
  3. popupMode 변수의 값을 쿠키의 값으로 갱신 (PopupClose 쿠키 값을 “on”으로 설정했다면 팝업창이 더는 뜨지 않을 것)
  4. [닫기] 버튼 클릭 시 호출되는 함수(팝업창 숨김 처리)
  5. [하루 동안 열지 않음]을 체크했는지 확인
    → [하루 동안 열지 않음] 박스를 체크박스를 체크하면, chkVal 변수에 “1”이 저장되고, 체크하지 않으면 아무 값도 저장되지 않음
//PopupMain.jsp 코드 해석-id가 "inactiveToday"이면서 "체크된" 체크박스의 값을 읽어와서 chkVal 변수에 저장함

var chkVal = $("input:checkbox[id=inactiveToday]:checked").val();

 

6. 쿠키 설정 페이지인 PopupCookie.jsp 실행 (ajax( )가 비동기 HTTP 요청을 보내는 jQuery 함수)

//PopupMain.jsp 코드 해석

        $.ajax({                                                             //4)비동기로 요청을 보냄
            url : './PopupCookie.jsp',                                       //1)PopupCookie.jsp 파일에
            type : 'get',                                                    //2)HTTP GET 방식으로
            data : {inactiveToday : chkVal},                                 //3)inactiveToday =< chkVal 변수의 값> 데이터를
            dataType : "text",                                               //5)응답 데이터의 타입은 일반 텍스트이며
            success : function(resData) {                                    //6)요청 성공 시
                if (resData != '')                                           //7)응답 데이터가 있다면
                    location.reload();                                       //8)페이지를 새로고침함        
	          }
        });

 

7. 요청 성공 시 호출되는 함수

 

2) 보낸 요청을 받는 PopupCookie.jsp에서 “PopupClose” 쿠키를 적절하게 설정한 후 응답 객체에 추가해야 함

//PopupClose.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" trimDirectiveWhitespaces="true"%>
<%
String chkVal = request.getParameter("inactiveToday");    //1."inactiveToday" 매개변수의 값 얻기

//2.(if문 전체)
if (chkVal != null && chkVal.equals("1")) {    //3. 값이 "1"이면 쿠키를 생성해 응답 객체에 추가
    Cookie cookie = new Cookie("PopupClose", "off");  // 쿠키 생성 
    cookie.setPath(request.getContextPath());  // 경로 설정
    cookie.setMaxAge(60*60*24);  // 유지 기간 설정
    response.addCookie(cookie);  // 응답 객체에 추가 
    out.println("쿠키 : 하루 동안 열지 않음");  
}
%>
  1. 체크박스 폼값(”inactiveToday”의 매개변수의 값)을 받음
  2. 에서 출력하는 문자열은 PopupMain.jsp의 7.부분에서 콜백됨 (쿠키 생성 후 새로고침하면, popupMode에 “off”가 저장되므로 레이어 팝업창은 열리지 않음)
  3. 값이 “1”이면 이름이 “PopupClose”, 값이 “off”, 경로는 컨텍스트 루트, 유지 기간은 하루인 쿠키를 생성 후 응답 객체에 추가
  • PopupMain.jsp 실행 결과 - [하루 동안 열지 않음] 체크 후 [닫기] 클릭 시, 상태가 바로 “off”로 바뀌며 새로고침 시에도 팝업창이 뜨지 않음을 알 수 있음

반응형