Filter url 제외시키기

2019-02-14

Spring Filter url 제외시키기

필터를 등록할때는 모든 url을 필터 처리하기위해 아래와 같이 필터를 맵핑하는 경우가 많다.

	<filter>
		<filter-name>SessionFilter</filter-name>
		<filter-class>com.todo.restful.filter.SessionFilter</filter-class>
	</filter>
	
	<filter-mapping>
		<filter-name>SessionFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

하지만 몇개를 제외하고 싶다면 어떻게 해야 할까?

		String path = ((HttpServletRequest) req).getRequestURI();
		if (path.contains("/login")) { 
			// 제외한 url이 들어 왔을때 동작할 코드 작성
		} else {
			// 원래의 필터 기능 동작을 할 코드 작성
		   }

현재의 url을 가져와서 비교를 하는 방법을 사용하면된다.

하지만 위에 코드는 오류를 범할 가능성이 높은 코드다. 왜냐하면 contains() 함수를 사용했기 때문에 login이 포함되면 필터링 동작을 안하기 때문이다.

그러므로 path.startsWith() 함수나 여러가지 API 함수들을 사용하면 될것이다.

다른 방법은 다음과 같다 :

필터를 web.xml에 정의할때 초기 파라미터로 제외할 url들을 적어주는 것이다.

<filter>
    <filter-name>LDAPAuthenticationFilter</filter-name>
    <filter-class>com.programmer.gate.filters.LDAPAuthenticationFilter</filter-class>
    <init-param>
        <param-name>excludedUrls</param-name>
        <!-- 제외할 url들  -->
        <param-value>/DatabaseAuthenticatedServlet,/UnAuthenticatedServlet</param-value>
    </init-param>
</filter>

그런 다음 필터 클래스에 List<String> 타입의 변수를 하나 선언해주자.

private List<String> excludedUrls;

init() 함수에서 FinterConfig 를 이용하여 <init-param> 에서 선언해준 제외할 url들을 가져온다. 콤마(,) 로 구분 지어줄 것이다.

public void init(FilterConfig filterConfig) throws ServletException {
    String excludePattern = filterConfig.getInitParameter("excludedUrls");
    excludedUrls = Arrays.asList(excludePattern.split(","));
}

doFilter()에서 URL을 체크해주는 로직을 짜주면 끝이다.

public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
            throws IOException, ServletException {
 
    String path = ((HttpServletRequest) req).getServletPath();
        
    if(!excludedUrls.contains(path))
    {
		// 제외할 url들이 아니면 동작할 로직
    }
        
    // 제외할 url들이면 그냥 흘려보내준다.
    chain.doFilter(req, resp);
}