// Filter 인터페이스 구현
public class LoginCheckFilter implements Filter{
	// 필터에서 배제할 화이트리스트 전역 배열
	private static final String[] whitelist = 
		{"/","/members/add","/login","/logout","/css/*"};
	// 필터 메서드
	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
        // request,response 형변환, URI 획득
		HttpServletRequest httpRequest = (HttpServletRequest) request;
		String requestURI = httpRequest.getRequestURI();
		HttpServletResponse httpResponse = (HttpServletResponse)response;
        // 필터 기능
		try {
			System.out.println("인증 필터 체크 시작 : " + requestURI);
			if(isLoginCheckPath(requestURI)) { // whitelist가 아닌 uri만을 검증
				System.out.println("인증 체크 로직 실행 : " + requestURI);
				HttpSession session = httpRequest.getSession(false);
				if(session == null || session.getAttribute(SessionConst.LOGIN_MEMBER)==null){
					System.out.println("미인증 사용자 요청" + requestURI);
					// 로그인으로 redirect (로그인하지 않은 상태로 items url 접근 -> 로그인페이지가 보여져야 함)
					httpResponse.sendRedirect("/login?redirectURL"+requestURI);
					return; //(미인증 사용자는 다음으로 진행하지 않고 종료)
				}
			}
			// 다음으로 진행
			chain.doFilter(request, response);
		}catch(Exception e) {
			e.printStackTrace();
		}finally {
			System.out.println("인증 체크 필터 종료 : " + requestURI);
		}
	}
	// 화이트 리스트 경로인지를 체크하는 별도의 메서드
	private boolean isLoginCheckPath(String requestURI) {
		// PatternMatchUtils : 간단한 패턴 매치를 판별하기 위한 유틸
		return !PatternMatchUtils.simpleMatch(whitelist, requestURI);
	}
}