본문 바로가기
Develop/Feature

Filter, Interceptor

by 코젼 2024. 7. 16.
728x90
반응형

목차

     

    웹 애플리케이션 개발에서 주로 사용되는 개념으로, 요청(Request)와 응답(Response) 과정에서 특정 작업을 수행하기 위해 사용된다.

    구현 및 사용 방식에서 차이가 있다.

     

    # 요약

    • Filter: 서블릿 컨테이너에서 제공하며, 모든 요청에 대해 작동할 수 있는 범용적인 기능을 제공한다. 주로 웹 애플리케이션의 요청 처리 전 후에 사용된다.
    • Interceptor: 스프링 같은 특정 프레임워크에서 제공하며, 특정 컨트롤러나 메서드에 대해 작동할 수 있다. 요청 전 후 및 완료 후에 작업을 수행할 수 있다.

    Filter

    • 서블릿 기반: 필터는 서블릿 컨테이너 (예: Tomcat) 에서 제공되며, 서블릿 요청 전후에 작동한다.
    • 범용성: 모든 요청에 대해 동작할 수 있으며, 특정 URL 패턴에 대해 필터를 적용할 수 있다.
    • 처리 순서: 여러 필터를 체인으로 연결하여 순차적으로 처리할 수 있다.

    로그인 검증 필터 예제

    1. LoginFilter.java

    import javax.servlet.*;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    public class LoginFilter implements Filter {
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
            // 필터 초기화 코드
        }
    
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
                throws IOException, ServletException {
            HttpServletRequest httpRequest = (HttpServletRequest) request;
            HttpServletResponse httpResponse = (HttpServletResponse) response;
    
            String loginURI = httpRequest.getContextPath() + "/login";
    
            boolean loggedIn = httpRequest.getSession().getAttribute("user") != null;
            boolean loginRequest = httpRequest.getRequestURI().equals(loginURI);
    
            if (loggedIn || loginRequest) {
                chain.doFilter(request, response); // 다음 필터 또는 서블릿으로 요청 전달
            } else {
                httpResponse.sendRedirect(loginURI); // 로그인 페이지로 리다이렉트
            }
        }
    
        @Override
        public void destroy() {
            // 필터 종료 코드
        }
    }

    2. web.xml

    <filter>
        <filter-name>loginFilter</filter-name>
        <filter-class>com.example.LoginFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>loginFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

     


    Interceptor

    • 프레임워크 종속: 주로 스프링 같은 특정 프레임워크에서 제공되며, 컨트롤러의 요청 전후에 작동한다.
    • 선택적 적용: 특정 컨트롤러 또는 메서드에 대해서만 인터셉터를 적용할 수 있다.
    • 메섣 기반: preHandle, postHandle, afterCompletion 메서드를 통해 요청 전, 후, 완료 후 작업을 정의할 수 있다.

    로그인 검증 인터셉터 예제

    1. LoginInterceptor.java

    import org.springframework.stereotype.Component;
    import org.springframework.web.servlet.HandlerInterceptor;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    @Component
    public class LoginInterceptor implements HandlerInterceptor {
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            String loginURI = "/login";
    
            boolean loggedIn = request.getSession().getAttribute("user") != null;
            boolean loginRequest = request.getRequestURI().equals(loginURI);
    
            if (loggedIn || loginRequest) {
                return true; // 컨트롤러로 요청 전달
            } else {
                response.sendRedirect(loginURI); // 로그인 페이지로 리다이렉트
                return false;
            }
        }
    }

    2. WebConfig.class

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
    
    @Configuration
    public class WebConfig implements WebMvcConfigurer {
        @Autowired
        private LoginInterceptor loginInterceptor;
    
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(loginInterceptor).addPathPatterns("/**").excludePathPatterns("/login", "/resources/**");
        }
    }
    728x90
    반응형

    'Develop > Feature' 카테고리의 다른 글

    Redis  (0) 2024.07.23
    [Docker] Database docker-compose 구축(mysql, redis)  (0) 2024.07.22
    Mac Node.js 설치  (0) 2024.06.24
    Swagger UI 사용  (0) 2024.06.12
    Layered Architecture 구조, API 적용하기  (0) 2024.05.28

    댓글