지난 시간에 이어
웹 페이지에서는 페이지 접근에 대한 조건을 체크해주는
Filter를 적용해보려고 한다.
❕ 필터란?
디스패처 서블릿(Dispatcher Servlet)에 요청이 전달되기 전/후에
Url 패턴에 맞는 모든 요청에 대해
부가작업을 처리할 수 있는 기능 제공
❕ 필터(Filter) 적용이 필요한 이유
웹페이지에서 허락한 사용자가 아닌 유저가
(ex) 관리자 페이지 등에 강제로 접근하게 될 때
접근 조건을 체크해서 판단해줘야
문제 발생을 대비할 수 있음
- 프로젝트의 이전 세팅이 궁금하다면 이전 게시글 참고 요망 -
[Spring Boot] 0.1.Project 세팅하기(이클립스/spring.io/maven/war)
이번 게시글에서는 리얼 찐찐 간단한(?) 프로젝트 생성 설정에 대한 정보만 담았다 쏘 씜쁠 * 우선 시작 전에 프로젝트 스펙 사전 계획! 0. 계획한 스펙을 sping initailizr에서 작성 https://start.spring.io/
younimini.tistory.com
[Spring Boot] 0.2. MyBatis 연동하기(이클립스/mysql/SpringMVC)
지난 시간에는 Spring Boot Project에 index.jsp 띄우는 과정을 기록했는데 오늘은 DB설정 MyBatis 연동에 관해 기록해본다. 이어서 시작 전에 *사용할 스펙과 프로그램에 대해 미리 체크* (이전 게시글에서
younimini.tistory.com
Filter 를 이용한 Uri 체크
작성할 파일 리스트
(1) 필터 Interface : CustomFilter.java
(2) 필터 구현부 : UriCheckFilter.java
(3) 필터 등록 : WebConfig.java
참고로 다음 포스팅은 AOP 로깅 로직이라서
로그 기록은 다음 게시글에서 만나욥
1. 필터 인터페이스
필터를 추가하기 위해서는 jakarta.servlet의 Filter 인터페이스를 구현(implements)해야하며,
이는 다음의 세가지 메소드를 가지고 있다.
☞ init() : 필터 초기화 메서드 (서블릿 컨테이너 생성 시 호출)
- 요청 시 호출되는것이 아니라 웹 서버 기동시 스프링 컨테이너가 생성될때 호출된다.
☞doFilter() : 요청이 올때마다 호출되는 메서드 (필터의 로직 -조건체크- )
- 요청 시 호출
☞ destroy() : 필터 종료 메서드 (서블릿 컨테이너 종료 시 호출)

public interface CustomFilter {
public default void init(FilterConfig filterConfig) throws ServletException{}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException;
public default void destroy() {}
}
2. 필터 구현 및 생성
필터를 사용하기 위해서 필터 인터페이스의 구현 클래스 작성

@Slf4j
public class UriCheckFilter implements Filter {
private static final String[] whiteList = {"/","/index", "/test"}; //임의로 테스트할 url 작성
@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("URI체크 필터시작 {} ", requestURI);
if(isURICheckPath(requestURI)) {
log.info("URI체크 로직 실행 {} ", requestURI);
HttpSession session = httpRequest.getSession(false);
if(session == null || session.getAttribute(requestURI) == null) {
log.info("X {} ", requestURI);
httpResponse.sendRedirect("/"); //꼭 있는 URI를 넣어줍니다.
return;
}
}
chain.doFilter(request, response);
} catch (Exception e) {
throw e;
} finally {
log.info("URI체크 필터종료 {} ", requestURI);
}
}
private boolean isURICheckPath(String requestURI) {
return !PatternMatchUtils.simpleMatch(whiteList, requestURI);
}
}
3. 필터 등록 및 설정
⁂ FilterRegistrationBean : 스프링 부트 사용 시 필터 등록을 위한 클래스
⁂ setFilter(new UriCheckFilter()) : 등록할 필터 지정
⁂ setOrder(1) : 필터의 순서를 지정(높을수록 우선순위)
⁂ addUrlPatterns("/*") : 필터에 적용할 URL 패턴을 지정
- 한번에 여러 패턴 지정 가능( addUrlPatterns("/url1", "/url2") )

@Configuration
public class WebConfig {
@Bean
public FilterRegistrationBean uriCheckFilter() {
FilterRegistrationBean<Filter> filterRegistrationBean = new FilterRegistrationBean<Filter>();
filterRegistrationBean.setFilter(new UriCheckFilter());
filterRegistrationBean.setOrder(1);
filterRegistrationBean.addUrlPatterns("/*", "/resources/**");
return filterRegistrationBean;
}
}
필터 적용하자고 온갖 블로그를 다 뒤적이며
어떻게 작성해야 깔끔할까 고민하다
최소로 작성할 수 있는 필터로 간단하게 정리해보았다.
최종적으로

"/", "/index" 로 접근 잘 되고

허락되지 않은 "/access" 접근 시
설정한 페이지인 index.jsp로 돌아가버린다!
다음번에 재참고해야지..
'웹 > Spring' 카테고리의 다른 글
| [Spring] Spring Controller 메소드 리턴타입 정리 (0) | 2024.01.30 |
|---|---|
| [Spring] @Aurowired 의존성 주입(Dependency Injection) (0) | 2024.01.29 |
| [Spring Boot] 0.2. MyBatis 연동하기(이클립스/mysql/SpringMVC) (0) | 2024.01.18 |
| [Spring Boot] 0.1.Project 세팅하기(이클립스/spring.io/maven/war) (0) | 2024.01.17 |
| [Spring] 필터(Filter)와 인터셉터(Interceptor)의 개념 및 차이 (0) | 2024.01.16 |