// 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);
}
}