LoginSignup
2
3

More than 5 years have passed since last update.

Servlet3.1のFilterの順番を指定する方法

Last updated at Posted at 2017-09-03

ちょっとハマったのでまとめます。

事前準備

以下のServletを実行して、Filterの順番を確認します。

HelloWorld.java
@WebServlet(urlPatterns = { "/HelloWorld" })
public class HelloWorld extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        PrintWriter out = response.getWriter();
        out.println("Hello World: ");
    }
}

1. web.xmlを使わない方法

Filterの順番は定義しません。

SampleFilter1.java
@WebFilter(filterName="SampleFilter1", urlPatterns="/*")
public class SampleFilter1 implements Filter {
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("SampleFilter1");
        chain.doFilter(request, response);
    }
    public void init(FilterConfig fConfig) throws ServletException {}
    public void destroy() {}
}
SampleFilter2.java
@WebFilter(filterName="SampleFilter2", urlPatterns="/*")
public class SampleFilter2 implements Filter {
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("SampleFilter1");
        chain.doFilter(request, response);
    }
    public void init(FilterConfig fConfig) throws ServletException {}
    public void destroy() {}
}

/HelloWorldにアクセスすると、コンソールに以下の行が表示されます。

console
SampleFilter1
SampleFilter2

web.xmlを使う方法(<url-pattern>を指定しない)

Filterは、上記のFilterと同じです。

web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         id="WebApp_ID" version="3.0">

   <filter-mapping>
        <filter-name>SampleFilter2</filter-name>
        <url-pattern />
    </filter-mapping>
    <filter-mapping>
        <filter-name>SampleFilter1</filter-name>
        <url-pattern />
    </filter-mapping>

</web-app>
console
SampleFilter1
SampleFilter2

SampleFilter2, SampleFilter1の順番でweb.xmlに定義しましたが、この順番でFilterは実行されませんでした。

web.xmlを使う方法(<url-pattern>を指定する)

Filterは変更なし。

web.xml
<filter-mapping>
    <filter-name>SampleFilter2</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

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

web.xmlに定義した順番で、Filterが処理されました。

console
SampleFilter2
SampleFilter1

まとめ

web.xmlに定義した<url-pattern>が優先されるているような感じ?

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3