[Spring] Filter

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>
Code language: HTML, XML (xml)
  • <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() {

    }
}
Code language: JavaScript (javascript)

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

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

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


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


댓글 남기기