@Slf4j
public class LoginCheckFilter implements Filter {
Filter를 구현하는 클래스를 만들어 주었다.
public default void init(FilterConfig filterConfig) throws ServletException {}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException;
public default void destroy() {}
Filter 인터페이스는 3가지 init, doFilter, destroy 구현체를 제공하는데 위와 같이 doFilter 외는 default를 사용하고 있으므로 따로 구현하지 않아도 된다.
@Slf4j
public class LoginCheckFilter implements Filter {
private static final String[] whitelist = {"/user/regUser/insert",
"/user/regUser",
"/user/logIn",
"/user/logIn/page",
"/css/*",
"/session-info"};
먼저, whitelist를 만들어 주었다. 이 화이트 리스트에서는 Session이 없는 미인증 사용자가 접근할 수 있는 페이지 경로를 설정해 주었다.
예를 들면, Session이 없어도 로그인 페이지와 회원가입 등은 보여줘야 하니 여기에 체크해 주었다.
아직 구현하지 않은 비밀번호 찾기와 같은 페이지는 따로 적어주지 않았다. 나중에 필요에 따라 천천히 추가할 예정이다.
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
String requestURI = httpRequest.getRequestURI();
HttpServletResponse httpResponse = (HttpServletResponse) response;
try{
log.info("인증 체크 필터 시작 = {}", requestURI);
if (isLoginCheckPath(requestURI)) {
log.info("인증 체크 로직 실행 = {}", requestURI);
HttpSession session = httpRequest.getSession(false);
if (session == null || session.getAttribute(SessionConst.LOGIN_MEMBER) == null) {
log.info("미인증 사용자 요청 = {}", requestURI);
//로그인으로 redirect
httpResponse.sendRedirect("/user/logIn");
//?redirectURL=" + requestURI 입력했던 경로로 가고 싶을 떄
return;
}
}
chain.doFilter(request, response);
} catch (Exception e) {
throw e; //예외 로깅 가능 하지만, 톰캣까지 예외를 보내주어야 한다.
}finally {
log.info("인증 체크 필터 종료 = {}", requestURI);
}
}
인증 체크 필터가 시작되면 먼저 들어간 링크가 위에서 등록한 Session을 가지고 있지 않은 사용자도 접근이 가능한 화이트 리스트에 속한 페이지 경로인지 체크한다.
그 다음에 Session이 있는지 체크한다. Session이 없다면 로그인 창으로 돌려보내준다.
@Configuration
public class WebConfig {
@Bean
public FilterRegistrationBean<Filter> loginCheckFilter() {
FilterRegistrationBean<Filter> filterFilterRegistrationBean = new FilterRegistrationBean<>();
filterFilterRegistrationBean.setFilter(new LoginCheckFilter());
filterFilterRegistrationBean.setOrder(1); // 적용 순서
filterFilterRegistrationBean.addUrlPatterns("/*"); //어디에 적용할지?, 화이트 리스트로 걸러줘서 다 넣어도 된다.
return filterFilterRegistrationBean;
}
}
WebConfig를 만들고 Configuration 어노테이션을 임포트 해준 뒤 위에서 만들어준 Filter를 등록한다.
주석을 참고하면 된다. Filter가 여러 개일 때 적용 순서를 설정하고 어느 페이지에 적용할지 체크한다.
나는 일단 화이트 리스트에서 접근 가능한 페이지는 따로 설정을 해 두었기 때문에 filterFilterRegistrationBean.addUrlPatterns("/*"); 이렇게 모든 페이지에 적용을 하도록 설정을 해 주었다.
FIlter 다음으로 적용되는 인터셉터 개념도 있는데 추가로 나중에 공부해서 적용하던가 해 봐야겠다.
'Project > 소경관' 카테고리의 다른 글
[소경관] : 카카오 주소 API 사용하기 (0) | 2022.04.21 |
---|---|
[소경관] : 회원가입 로직 검증 다듬어주기, Spring Bean Validator 사용 (0) | 2022.04.18 |
[소경관] : Session으로 logout 구현하기 (0) | 2022.04.17 |
[소경관] : Session 적용하기 (0) | 2022.04.17 |
[소경관] : thymeleaf와 JPA, builder 패턴을 사용하여 로그인 구현하기 (0) | 2022.04.15 |
댓글