본문 바로가기
프로그래밍/자바

Tomcat 필터 맵핑 제외하기 - Url Rewrite Filter 이용

by pentode 2018. 4. 17.

Tomcat의 web.xml 파일에서 필터 맵핑 부분을 보면 아래와 같은 형태가 됩니다.


<filter-mapping>
    <filter-name>TestFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>


이렇게 필터에 맵핑되는 URL중에 특정 URL을 필터에서 제외하기 위한 방법을 찾아 보았습니다. 하지만 필터 맵핑에서 URL을 제외하는 방법을 없다는 것을 알게 되었습니다.


필터를 직접 만들었다면 필터내에서 호출된 URL이 특정 URL일 경우 다른 방식의 처리를 하도록 코딩을 할 수 있겠지만, 소스가 없는 필터라는 처리가 힘들것 입니다.


그래서 찾은 것이 URL Rewrite Filter 입니다. 이 필터는 특정 URL에 대한 요청을 다른 곳으로 redirect 또는 forward 할 수 있습니다.


이 필터를 사용함에 있어서 유의할 점은 필터의 적용 순서 입니다. Rewrite 필터가 다른 필터 보다 먼저 적용되어야 합니다. 서블릿에서 필터의 적용순서는 web.xml 파일에 필터 맵핑이 나오는 순서입니다. Rewrite 필터 맵핑을 다른 필터보다 앞에 정의 하여야 하겠습니다.



1. 다음 사이트에서 jar 파일을 다운로드 받아서 WEB-INF/lib 폴더에 넣습니다. urlrewritefilter-4.0.3.jar 파일 입니다.


http://www.tuckey.org/urlrewrite/




메이븐을 사용중이라면 다음 의존성을 pom.xml 파일에 추가합니다.


<dependency>
    <groupId>org.tuckey</groupId>
    <artifactId>urlrewritefilter</artifactId>
    <version>4.0.3</version>
</dependency>



2. WEB-INF/web.xml 파일에 필터 정의를 추가합니다.


<filter>
    <filter-name>UrlRewriteFilter</filter-name>
    <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>UrlRewriteFilter</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
</filter-mapping>


이 예에서는 <dispatcher> 요소를 사용해서 클라이언트로부터의 직접 요청(REQUEST)와 포워드(FORWARED) 되는 곳에 필터를 적용하고 있습니다. 필요한 <dispatcher>만 추가 하면 되겠습니다.



3. WEB-INF/ 폴더에 포워딩 규칙 파일인 urlrewrite.xml 파일을 추가합니다.


<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 4.0//EN"
        "http://www.tuckey.org/res/dtds/urlrewrite4.0.dtd">
<urlrewrite>
    <rule>
        <note>
            /test/status/ 로 요청이 들어오면
            /rewrite-status 로 리다이렉트 됩니다.
        </note>
        <from>/test/status/</from>
        <to type="redirect">%{context-path}/rewrite-status</to>
    </rule>
    <outbound-rule>
        <note>
            아웃바운드 룰은 response.encodeURL 또는 JSTL 의 c:url 이 사용될때
            /rewrite-status 를 /test/status 로 변경합니다.
        </note>
        <from>/rewrite-status</from>
        <to>/test/status/</to>
    </outbound-rule>
</urlrewrite>


이 예제의 규칙은 /test/status/ 로 들어오는 요청을 /rewrite-status 로 리다이렉트 하고, 웹페이지내의 response.encodeURL 또는 JSTL의 <c:url /> 로 작성되는 /rewrite-status를 /test/status 로 변경합니다.



더 많은 설정은 사이트내의 사용자 매뉴얼을 참조해 주세요.


http://cdn.rawgit.com/paultuckey/urlrewritefilter/master/src/doc/manual/4.0/index.html

Tomcat의 web.xml 파일에서 필터 맵핑 부분을 보면 아래와 같은 형태가 됩니다.


<filter-mapping>
    <filter-name>TestFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>


이렇게 필터에 맵핑되는 URL중에 특정 URL을 필터에서 제외하기 위한 방법을 찾아 보았습니다. 하지만 필터 맵핑에서 URL을 제외하는 방법을 없다는 것을 알게 되었습니다.


필터를 직접 만들었다면 필터내에서 호출된 URL이 특정 URL일 경우 다른 방식의 처리를 하도록 코딩을 할 수 있겠지만, 소스가 없는 필터라는 처리가 힘들것 입니다.


그래서 찾은 것이 URL Rewrite Filter 입니다. 이 필터는 특정 URL에 대한 요청을 다른 곳으로 redirect 또는 forward 할 수 있습니다.


이 필터를 사용함에 있어서 유의할 점은 필터의 적용 순서 입니다. Rewrite 필터가 다른 필터 보다 먼저 적용되어야 합니다. 서블릿에서 필터의 적용순서는 web.xml 파일에 필터 맵핑이 나오는 순서입니다. Rewrite 필터 맵핑을 다른 필터보다 앞에 정의 하여야 하겠습니다.



1. 다음 사이트에서 jar 파일을 다운로드 받아서 WEB-INF/lib 폴더에 넣습니다. urlrewritefilter-4.0.3.jar 파일 입니다.


http://www.tuckey.org/urlrewrite/



메이븐을 사용중이라면 다음 의존성을 pom.xml 파일에 추가합니다.


<dependency>
    <groupId>org.tuckey</groupId>
    <artifactId>urlrewritefilter</artifactId>
    <version>4.0.3</version>
</dependency>



2. WEB-INF/web.xml 파일에 필터 정의를 추가합니다.


<filter>
    <filter-name>UrlRewriteFilter</filter-name>
    <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>UrlRewriteFilter</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
</filter-mapping>


이 예에서는 <dispatcher> 요소를 사용해서 클라이언트로부터의 직접 요청(REQUEST)와 포워드(FORWARED) 되는 곳에 필터를 적용하고 있습니다. 필요한 <dispatcher>만 추가 하면 되겠습니다.



3. WEB-INF/ 폴더에 포워딩 규칙 파일인 urlrewrite.xml 파일을 추가합니다.


<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 4.0//EN"
        "http://www.tuckey.org/res/dtds/urlrewrite4.0.dtd">
<urlrewrite>
    <rule>
        <note>
            /test/status/ 로 요청이 들어오면
            /rewrite-status 로 리다이렉트 됩니다.
        </note>
        <from>/test/status/</from>
        <to type="redirect">%{context-path}/rewrite-status</to>
    </rule>
    <outbound-rule>
        <note>
            아웃바운드 룰은 response.encodeURL 또는 JSTL 의 c:url 이 사용될때
            /rewrite-status 를 /test/status 로 변경합니다.
        </note>
        <from>/rewrite-status</from>
        <to>/test/status/</to>
    </outbound-rule>
</urlrewrite>


이 예제의 규칙은 /test/status/ 로 들어오는 요청을 /rewrite-status 로 리다이렉트 하고, 웹페이지내의 response.encodeURL 또는 JSTL의 <c:url /> 로 작성되는 /rewrite-status를 /test/status 로 변경합니다.



더 많은 설정은 사이트내의 사용자 매뉴얼을 참조해 주세요.


http://cdn.rawgit.com/paultuckey/urlrewritefilter/master/src/doc/manual/4.0/index.html

반응형