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

JAVA/JSP 12. 쿠키(Cookie) - 로그인 아이디 저장(편의 기능 구현하기: 자바스크립트 코드 추가, 쿠키 관리자)

개발학생 2023. 6. 8. 17:30
반응형

* 로그인 아이디 저장 동작 시나리오(예시-SW Expert Academy 홈페이지)

  • 로그인 아이디 저장: 로그인 페이지에서 아이디를 저장하는 기능을 말함
  • 로그인에 성공한 경우에만 쿠키를 생성 및 삭제

 

1) 쿠키에 저장된 아이디가 있으면, 로그인 페이지에서는 아이디가 자동 입력됨

  • [아이디 저장] 체크박스 체크 후 로그인 → [로그아웃] → 다시 로그인 창 접속

 

2) [아이디 저장하기] 체크박스를 해제하고 로그인에 성공하면 쿠키가 삭제됨

  • [아이디 저장] 체크박스 체크하지 않고 로그인 → [로그아웃] → 다시 로그인 창 접속(아이디가 자동으로 입력되어있지 않음)

 

1. 편의 기능 구현하기: 자바스크립트 코드 추가

  • 메시지 알림창을 띄운 후 다음 페이지나 이전 페이지로 이동하는 자바스크립트 코드 필요 (로그인 성공/실패 여부에 따른 다음 동작을 처리

1) JSP 코드에 자바스크립트 전체 코드 삽입

  • <script> 태그를 써야 하므로 소스가 전체적으로 지저분해지고, 반복되는 코드가 많아짐
  • 다음과 같이 JSP의 스크립틀릿 부분 중간에 자바스크립트 코드를 삽입해야 함
<%
...JSP 코드(스크립틀릿) ...
%>

//스크립틀릿 중간에 자바스크립트 코드 추가
//알림창을 띄우고 지정된 페이지로 이동하는 자바스크립트 코드
<script>
	alert('메시지');
	location.href='이동할 페이지 경로';
</script>

<%
...JSP 코드(스크립틀릿) ...
%>

 

2) 별도의 “도우미 클래스” 만들기

  • 1)의 단점 최소화 - 반복되는 소스가 줄어들어, 소스 코드가 전체적으로 깔끔해짐
  • JSP에서 <script> 태그 없이 단 한 줄로 자바스크립트 코드 추가 가능
<%
...JSP 코드(스크립틀릿) ...
%>

//스크립틀릿 중간에 자바스크립트 코드 추가
JSFunction.alertLocation("메시지", "이동할 페이지 경로", out);

<%
...JSP 코드(스크립틀릿) ...
%>
  • 다음의 JSFunction 클래스: 메시지 알림창을 띄운 후 특정 페이지로 이동하는 자바스크립트 코드를 추가해주는 메소드들을 담고 있음
//HelloJSP/Java Resources/src/utils/JSFunction.java

package utils;

import javax.servlet.jsp.JspWriter; //1.필요한 클래스 임포트

public class JSFunction {
	//메시지 알림창을 띄운 후 명시한 URL로 이동
	public static void alertLocation(String msg, String url, JspWriter out) {
			try {
	        String script = ""  // 3.삽입할 자바스크립트 코드
	                      + "<script>"
	                      + "    alert('" + msg + "');"
	                      + "    location.href='" + url + "';"
	                      + "</script>";
	        out.println(script);  // 자바스크립트 코드를 out 내장 객체로 출력(삽입)
	    }
	        catch (Exception e) {}
	}
	
	//5.메시지 알림창을 띄운 후 이전 페이지로 돌아감
	public static void alertBack(String msg, JspWriter out) {
	    try {
	        String script = ""
	                      + "<script>"
	                      + "    alert('" + msg + "');"
	                      + "    history.back();"
	                      + "</script>";
	        out.println(script);
	    }
	    catch (Exception e) {}
    }
}
  1. JspWriter 클래스 임포트(참고: 기본 내장 객체인 out이 JspWriter 타입)
  2. alertLocation( )은 알림창으로 메시지를 보여준 후, 명시한 URL로 이동하는 메소드
    → 매개변수 3개: msg(알림창에 띄울 메시지), url(알림창 닫은 후 이동할 페이지의 URL), out(자바스크립트 코드 삽입할 출력 스트림-JSP의 out 내장 객체)
  3. 2.의 메소드에서 자바스크립트 코드를 문자열 형태로 선언
  4. 3.에서 선언한 자바스크립트 코드를 out객체로 출력
  5. alertBack( )은 알림창을 띄운 후 무조건 이전 페이지로 돌아가는 메소드

 

2. 편의 기능 구현하기: 쿠키 관리자

  • 쿠키를 읽을 때는 쿠키를 배열로 가져오므로 반복문과 조건문 필요 → 사용하는 쿠키가 많아지면 조건문은 계속 복잡해지므로, 쿠키를 편하게 사용할 수 있도록 도와주는 클래스 작성
//Java Resources/src/utils/CookieManager.java
package utils;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class CookieManager {
    //명시한 이름, 값, 유지 기간 조건으로 새로운 쿠키를 생성
    public static void makeCookie(HttpServletResponse response, String cName,
            String cValue, int cTime) {
        Cookie cookie = new Cookie(cName, cValue); //1.쿠키 생성
        cookie.setPath("/");         //2.경로 설정
        cookie.setMaxAge(cTime);     //3.유지 기간 설정
        response.addCookie(cookie);  //4.응답 객체에 추가
    }

    // 명시한 이름의 쿠키를 찾아 그 값을 반환
    public static String readCookie(HttpServletRequest request, String cName) {
        String cookieValue = "";  // 반환 값

        Cookie[] cookies = request.getCookies();    //5.
        if (cookies != null) {
            for (Cookie c : cookies) {
                String cookieName = c.getName();
                if (cookieName.equals(cName)) {    //6.
                    cookieValue = c.getValue();  // 반환 값 갱신
                }
            }
        }
        return cookieValue;    //7.
    }

    // 명시한 이름의 쿠키를 삭제
    public static void deleteCookie(HttpServletResponse response, String cName) {
        makeCookie(response, cName, "", 0);    //8.
    }
}

1) makeCookie( ) 메소드 - 3개의 매개변수를 받아 쿠키를 만들고 응답 헤더에 추가

  1. 쿠키 생성
  2. 쿠키 경로 설정
  3. 쿠키 유지 기간 설정
  4. 쿠키를 응답 헤더(객체)에 추가

2) readCookie( ) 메소드 - 명시한 쿠키의 값을 읽어 반환

5. request 내장 객체로부터, 클라이언트가 보내온 쿠키 목록을 받음

6. 5.에서 받은 쿠키 목록 중 cName과 이름이 같은 쿠키가 있는지 확인

7. 6.의 조건 충족 시, 해당 쿠키의 값을 반환

3) deleteCookie( ) 메소드 - 주어진 이름의 기존 쿠키 삭제

8. makeCookie( ) 메소드 재활용 [쿠키 생성 시 값을 빈 문자열로, 유지 기간을 0으로 부여하면 되기 때문]

반응형