📘Filter 의 사용이유와 사용법 정리. Login Filter 구현
Login Filter 구현을 위해 우선 Filter 클래스를 생성해준다.Filter 를 거치지 않고 사용할 url 배열로 WHITE_LIST 를 만들어준다.Filter를 구현해서 모든 HTTP 요청을 가로채서 로그인 여부 등을 확인해준다.doFilter() 메서드가 실행되면서 필터가 실행된다.chain 을 통해 다음 로직으로 넘어가고, 필터를 거치지 못했다면(로그아웃 상태 등) 예외와 함께 리턴된다.public class LoginFilter implements Filter {
private static final String[] WHITE_LIST = {
"/users/signup",
"/users/login",
"/board",
"/board/detail/*"
};
//서버 요청 시 실행
@Override
public void doFilter(ServletRequest request,
ServletResponse response,
FilterChain chain
) throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpServletResponse httpResponse = (HttpServletResponse) response;
String requestURI = httpRequest.getRequestURI();
if (!isWhiteList(requestURI)) {
//통과 못하면 예외 처리
if(isAlreadyLogin(httpRequest, httpResponse)) return;
}
//통과시 다음 로직으로 넘어간다.
chain.doFilter(request, response);
}
//whiteList 인지 확인
private boolean isWhiteList(String requestURI) {
return PatternMatchUtils.simpleMatch(WHITE_LIST, requestURI);
}
}
Filter 는서블릿 단계에서 동작하기 때문에 CustomException 같은 전역 예외 처리기로 예외를 날릴수 없다.private boolean isAlreadyLogin(HttpServletRequest httpRequest, HttpServletResponse httpResponse) throws IOException {
HttpSession session = httpRequest.getSession(false);
//예외 메세지 날려준다.(간단한버전)
if (session == null || session.getAttribute(Const.USER_ID) == null) {
httpResponse.setStatus(HttpServletResponse.SC_UNAUTHORIZED); // 401
httpResponse.setContentType("application/json;charset=UTF-8"); //한글 타입 표기
httpResponse.getWriter().write("로그인이 필요합니다."); //전달 메세지
return true;
}
return false;
}
LoginFilter를 등록해주는 설정을 해준다.@Configuration : 이 클래스가 설정파일이라는 의미이다.@Bean 등록)WHITE_LIST 를 따로 지정해줬기 때문에 모든 url 을 등록해준다.@Configuration
public class SecurityConfig {
//로그인 필터를 서블릿 필터로 등로
@Bean
public FilterRegistrationBean<LoginFilter> loginFilter() {
FilterRegistrationBean<LoginFilter> filterRegistrationBean = new FilterRegistrationBean<>();
filterRegistrationBean.setFilter(new LoginFilter()); // Filter 등록
filterRegistrationBean.setOrder(1); // Filter 순서 1 설정
filterRegistrationBean.addUrlPatterns("/*"); // 전체 URL에 Filter 적용
return filterRegistrationBean;
}
}
401 Not Found 에러 메세지가 표시된다.