[Spring] Filter

2024. 7. 6. 22:39BE/Spring

1. Filter란?

 

필터는 스프링의 독자적인 기능이 아닌 자바 서블릿에서 제공합니다.

 

공통적인 기능들을 서블릿이 호출되기 전후로 수행(전처리)되게 하고 싶다면 Filter를 사용하면 된다.

 

<!-- web.xml -->
<filter>
  <display-name>MyFilter</display-name>
  <filter-name>MyFilter</filter-name>
  <filter-class>com.company.hello.controller.MyFilter</filter-class>
</filter>
<filter-mapping>
  <filter-name>MyFilter</filter-name>
  <url-pattern>/MyFilter</url-pattern>
</filter-mapping>
  • <url-pattern>/MyFilter</url-pattern> : 필터링할 url

 

public class MyFilter extends HttpFilter implements Filter {

    public void init(FilterConfig fConfig) throws ServletException {

    }

    class MyRequest extends HttpServletRequestWrapper {
        public MyRequest(HttpServletRequest request){
            super(request);    
        }

        // 재정의 가능함
        @Override
        public String getParameter(String name){
            String data = super.getParameter(name);
            if(data == null) return "";
            else return data;
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        // 사전 작업
        System.out.println("MyFilter : 사전 작업");
        HttpServletRequest req = (HttpServletRequest) request;
        HttpSession session = req.getSession();
        String word = req.getParameter("word");
        if("검열".equals(word)) { // 예시
            ...
            // controller까지 안 가도 처리할 수 있다.
        }

        // request hooking
        MyRequest myReq = new MyRequest(req);

        // pass the request along the filter chain
        chain.doFilter(myReq, response); // Pass!

        // 사후 작업 
        System.out.println("MyFilter : 사후 작업");
        response.getWriter().append("Filter는 response를 조작할 수 있다.");
    }

    public void destroy() {

    }
}

불필요하게 Controller까지 안 가도 된다.

 

Spring은 Filter보단 Interceptor를 사용하길 권하는 것 같다.

 

인증, 인코딩, 로깅, 이미지 변환 등과 같은 작업을 수행할 때 많이 사용한다.

 


 

  Filter Interceptor AOP
구현 Jakarta.servlet.Filter org.springframework.web.servlet.HandlerInterceptor  
관리 컨테이너 Servlet Container Spring Container Spring Container (Root)
적용 위치 web.xml servlet-context.xml execution으로 설정된 공통 코드 메서드
적용 대상 설정 url url execution에서 설정된 메서드(인자), 클래스 등 다양
동작 순서 Dispatcher Servlet 전달 전후 Controller에게 전달되기 전후 Proxy 패턴의 형태로 메서드 앞에 실행
request/response 객체 조작 가능 여부 O X X
주요 역할 Spring에 무관한 웹 자원 처리 Controller 관련 요청 및 응답 처리 주로 Business Logic 처리 후 Controller 처리
용도 사용자 인증, 권한 검사, 요청과 응답에 대한 로그, 문자열 인코딩, 웹 보안 관련 기능 인증 프로세스(로그인, 사용자 권한 관리), 사용자 세션 처리, 프로그램 실행 시간 측정 로깅, 트랜잭션, 에러 처리


 

'BE > Spring' 카테고리의 다른 글

[Spring] ControllerAdvice  (0) 2024.07.06
[Spring] Java Config  (0) 2024.07.06
[Spring] AOP  (0) 2024.07.06
[Spring] Interceptor  (0) 2024.07.06
[Spring] Spring Web Application의 동작 원리  (0) 2024.07.06