ちょっとハマったのでまとめます。
事前準備
以下の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>
が優先されるているような感じ?