빅데이터 Java 개발자 교육 - 53일차[JSP 실습 4(로그인 정보 저장용 Filter)]

Jun_Gyu·2023년 4월 13일
0
post-thumbnail

오늘은 고객의 마이페이지 생성 실습을 진행하였다.

그중 핵심이 되는 부분만 간단하게 정리를 하였다.

필터(로그인 상태 체크용)

controller도, mapper도, dto도 아님. 새로운 class를 생성해주어야 한다.

package filter;

import java.io.IOException;

import jakarta.servlet.Filter;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.annotation.WebFilter;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;


// 127.0.0.1:8080/web01/customer/home.do  		작동안됨!
//127.0.0.1:8080/web01/customer/mypage.do  		작동됨!
// 127.0.0.1:8080/web01/customer/orderlist.do   작동됨!

/* 필터를 사용할 주소창을 입력 */
@WebFilter(urlPatterns = {"/customer/mypage.do", "/customer/orderlist.do"})
public class CustomerFilter implements Filter{

	@Override
	public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
			throws IOException, ServletException {
		HttpServletRequest request = (HttpServletRequest) arg0; // arg0은 request
		HttpServletResponse response = (HttpServletResponse) arg1; // arg1은 response
		
		// 컨트롤러로 가기전에 수행해야 하는 작업들
		// 로그인이 되었는지 확인
		// 로그인이 안되었다면 로그인 페이지로 이동시키는 작업
		System.out.println("customer filter => " + request.getRequestURI());
		
		// 컨트롤러로 정상진입
		arg2.doFilter(arg0, arg1);
	}
}

위와 같은 경우에는

기존 HttpSession클래스를 불러와 로그인 상태에서만 접근이 가능한 페이지에서(예를들면 사용자의 마이페이지 등) 사용자의 id, 이름 등의 정보를 반복하여 일일이 세션에 저장했던 다른 Controller들과는 달리,

로그인때 받아왔던 사용자의 정보를 Filter를 통해 저장한 뒤 필요로 하는 모든 페이지에서 바로바로 간편하게 쓸 수 있게끔 하는 implements 이다.

세션에 저장된 정보를 토대로 request와 response의 객체를 각각 저장한 이후 System.out.println을 이용하여 필터를 적용시킨 url을 출력시키면

콘솔창에 아래와 같이 필터가 적용되어있는 주소에 한해서 세션의 접근이 이루어진다는 것을 알 수 있다.

이를 이용하여 HttpSession에 등록된 사용자 정보를 가지고
로그인의 상태의 유무를 판단하여 사용자가 다음으로 도달하게 될 페이지를 지정해줄 수 있다.

package filter;

import java.io.IOException;

import jakarta.servlet.Filter;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.annotation.WebFilter;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;

// 127.0.0.1:8080/web01/customer/home.do  		작동안됨!
//127.0.0.1:8080/web01/customer/mypage.do  		작동됨!
// 127.0.0.1:8080/web01/customer/orderlist.do   작동됨!

/* 필터를 사용할 주소창을 입력 */
@WebFilter(urlPatterns = { "/customer/mypage.do", "/customer/orderlist.do" })
public class CustomerFilter implements Filter {

	@Override
	public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
			throws IOException, ServletException {
		HttpServletRequest request = (HttpServletRequest) arg0; // arg0은 request
		HttpServletResponse response = (HttpServletResponse) arg1; // arg1은 response
		System.out.println("customer filter => " + request.getRequestURI());

		HttpSession httpSession = request.getSession();
		String sessionId = (String) httpSession.getAttribute("UID");

		if (sessionId == null) { // 세션에 등록된 UID 객체가 없으면 다시 로그인 페이지로 보냄.
			response.sendRedirect("login.do");
			return; // 메소드를 종료시킨다.
		}
		
		// UID가 존재할 시 원래 수항하는 페이지로 이동
		arg2.doFilter(arg0, arg1);
	}
}

위와같이 filter를 클래스로 따로 사용하는 이유는, 생성하고자 하는 기능이 늘어날수록

if(!로그인) {
	로그인 페이지로 보내기()	
}
else {
	다음작업 수행하기()
}

와 같은 형태의 단순 반복 작업이 늘어나게 되고, 번거롭게 된다. 이러한 문제를 해결하기 위해서 위와같이 filter기능을 사용할 수 있도록 class를 별개로 생성해주는 것이다.

단, 로그아웃이 발생하는 Controller에서는 별개로 세션을 초기화해주는 코드를 작성하여 보안적으로 안전하게 기능이 수행될 수 있도록 해야하겠다.

세션 초기화 코드

HttpSession httpSession = request.getSession();
httpSession.invalidate(); // 초기화. 보안상 가장 깔끔한 방법.
profile
시작은 미약하지만, 그 끝은 창대하리라

0개의 댓글