본문으로 바로가기
반응형

1. 기본 동작 

Spring MVC 요청 처리 순서로 인해 Filter에서 막으면 제일 빠르다.

단계 구성요소
1 Filter (가장 먼저) AccessMenuFilter, Spring Security 내부 필터 등
2 Spring Security Filter SecurityConfig의 httpSecurity.antMatchers()
3 DispatcherServlet 서블릿 매핑 (*.do, *.json 등)
4 Interceptor preHandle(), postHandle()
5 Controller @RequestMapping, @RestController
6 ExceptionHandler @ControllerAdvice 전역 예외처리

2. 코드 안내

DevToolsIgnoreFilter.java

public class DevToolsIgnoreFilter implements Filter {

	@Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // 초기화 필요 시 작성
    }

     @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
            throws IOException, ServletException {

        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;

        String uri = request.getRequestURI();

        // 크롬 개발자 도구 자동 요청이나 인증 경로 무시
        if (uri.contains(".well-known") || uri.contains("com.chrome.devtools.json")) {
            response.setStatus(HttpServletResponse.SC_OK);
            response.setContentType("application/json");
            response.setCharacterEncoding("UTF-8");
            response.getWriter().write("{\"status\": \"ok\", \"message\": \"Chrome DevTools auto request ignored\"}");
            return;
        }

        // 나머지는 정상 흐름대로 진행
        chain.doFilter(request, response);
    }

    @Override
    public void destroy() {
        // 리소스 해제 필요 시 작성
    }
}

3. 추가사항

❗인텔리제이에서는 해당 필터로만 처리하면 404에러가 뜨지 않고 무시되는데

이클립스에서는 여전히 404 에러가 생길 수 있다. 이것은 서버 구동 환경의 차이 때문인데 ..

 

1. Eclipse WTP는 요청을 무조건 DispatcherServlet으로 보냄

  • favicon.ico 요청도 내부적으로 DispatcherServlet (즉, Spring Controller)로 포워딩됨.
  • 그래서 Controller에서 해당 경로 못 찾으면 404가 뜸
  • javax.servlet.forward.* 로그에 보이는 것도 그 포워딩 흐름 때문

2. IntelliJ는 Tomcat에 직접 배포되는 방식이라 필터만으로 잘 걸러짐

  • 그래서 필터에서 return 하면 더 이상 Spring까지 안 가고 종료
  • 404 로그도 안 남고 완전 무시됨

 

그래서 이클립스에서도 404에러가 나지 않게 하려면

필터 위치를 확인해서 해당 필터가 DispatcherServlet 앞에 실행되야한다.

 

web.xml

<!-- # 필터 정의 -->
<filter>
    <filter-name>DevToolsIgnoreFilter</filter-name>
    <filter-class>kr.or.farm.cmmn.interceptor.AccessMenuFilter</filter-class>
</filter>

<!-- # 그 다음 매핑 전부 정리 -->
<filter-mapping>
    <filter-name>AccessMenuFilter</filter-name>
    <url-pattern>/favicon.ico</url-pattern>
</filter-mapping>
<filter-mapping>
    <filter-name>AccessMenuFilter</filter-name>
    <url-pattern>/.well-known/*</url-pattern>
</filter-mapping>
<filter-mapping>
    <filter-name>AccessMenuFilter</filter-name>
    <url-pattern>*.do</url-pattern>
</filter-mapping>
...

 

이렇게 하면 해당 페이지가 404에러 없이 무시된다.

반응형