天天看點

JAVA入門[15]-過濾器filter

過濾器是可用于 Servlet 程式設計的 Java 類,可以實作以下目的:

在用戶端的請求通路後端資源之前,攔截這些請求。

在伺服器的響應發送回用戶端之前,處理這些響應。

過濾器實作接口: javax.servlet.Filter

示例:定義過濾器實作計數器,counterFilter實作Filter接口

<code>public</code> <code>class</code> <code>counterFilter </code><code>implements</code> <code>Filter {</code>

<code>    </code><code>ServletContext context;</code>

<code>    </code><code>int</code> <code>count;</code>

<code>    </code><code>public</code> <code>void</code> <code>init(FilterConfig filterConfig) </code><code>throws</code> <code>ServletException {</code>

<code>        </code><code>context=filterConfig.getServletContext();</code>

<code>        </code><code>String initCount=filterConfig.getInitParameter(</code><code>"count"</code><code>);</code>

<code>        </code><code>count= Integer.valueOf(initCount);</code>

<code>    </code><code>}</code>

<code>    </code><code>public</code> <code>void</code> <code>doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) </code><code>throws</code> <code>IOException, ServletException {</code>

<code>        </code><code>context.log(</code><code>"===counterFilter do Filter===="</code><code>);</code>

<code>        </code><code>count++;</code>

<code>        </code><code>context.setAttribute(</code><code>"count"</code><code>,count);</code>

<code>        </code><code>filterChain.doFilter(servletRequest,servletResponse);</code>

<code>    </code><code>public</code> <code>void</code> <code>destroy() {</code>

<code>}</code>

  

jsp調用:

<code>&lt;%@ page contentType=</code><code>"text/html;charset=UTF-8"</code> <code>language=</code><code>"java"</code> <code>%&gt;</code>

<code>&lt;div&gt;歡迎,您是第 &lt;%=application.getAttribute(</code><code>"count"</code><code>)%&gt; 位訪客&lt;/div&gt;</code>

過濾器是可插拔的,通過web.xml來聲明,然後映射到您的應用程式的部署描述符中的 Servlet 名稱或 URL 模式。

當 Web 容器啟動 Web 應用程式時,它會為部署描述符中聲明的每一個過濾器建立一個執行個體。

web.xml 中的 filter-mapping 元素的順序決定了 Web 容器應用過濾器到 Servlet 的順序。若要反轉過濾器的順序,隻需要在 web.xml 檔案中反轉 filter-mapping 元素即可。

<code>&lt;filter&gt;</code>

<code>    </code><code>&lt;filter-name&gt;counterFilter&lt;/filter-name&gt;</code>

<code>    </code><code>&lt;filter-</code><code>class</code><code>&gt;filter.counterFilter&lt;/filter-</code><code>class</code><code>&gt;</code>

<code>    </code><code>&lt;init-param&gt;</code>

<code>        </code><code>&lt;param-name&gt;count&lt;/param-name&gt;</code>

<code>        </code><code>&lt;param-value&gt;</code><code>100</code><code>&lt;/param-value&gt;</code>

<code>    </code><code>&lt;/init-param&gt;</code>

<code>&lt;/filter&gt;</code>

<code>&lt;filter-mapping&gt;</code>

<code>    </code><code>&lt;url-pattern&gt;/*&lt;/url-pattern&gt;</code>

<code>&lt;/filter-mapping&gt;</code>

在web.xml中用init-param節點設定參數,然後在 init 方法使用 FilterConfig 對象擷取參數。

<code>context=filterConfig.getServletContext();</code>

<code>String initCount=filterConfig.getInitParameter(</code><code>"count"</code><code>);</code>

@WebFilter注解可以實作了javax.servlet.Filter接口的類定義為過濾器元件

<code>@WebFilter</code><code>(filterName = </code><code>"filter1"</code><code>,initParams =</code><code>@WebInitParam</code><code>(name = </code><code>"count"</code><code>,value = </code><code>"100"</code><code>),urlPatterns = </code><code>"/*"</code><code>)</code>

<code>public</code> <code>class</code> <code>filter1 </code><code>implements</code> <code>Filter {</code>

<code>    </code><code>public</code> <code>void</code> <code>doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) </code><code>throws</code> <code>ServletException, IOException {</code>

<code>        </code><code>context.log(</code><code>"filter1.doFilter()"</code><code>);</code>

<code>        </code><code>chain.doFilter(req, resp);</code>

<code>    </code><code>public</code> <code>void</code> <code>init(FilterConfig config) </code><code>throws</code> <code>ServletException {</code>

<code>        </code><code>context=config.getServletContext();</code>

執行順序:預設按照filter的名字排序,如果想調整順序,還是要配置filter-mapping節點。

<code>        </code><code>&lt;filter-name&gt;filter2&lt;/filter-name&gt;</code>

<code>        </code><code>&lt;url-pattern&gt;/*&lt;/url-pattern&gt;</code>

<code>    </code><code>&lt;/filter-mapping&gt;</code>

<code>    </code><code>&lt;filter-mapping&gt;</code>

<code>        </code><code>&lt;filter-name&gt;filter1&lt;/filter-name&gt;</code>

檢視一下Tomcat Localhost Log:

02-Jun-2017 13:26:20.182 資訊 [RMI TCP Connection(3)-127.0.0.1] org.apache.catalina.core.ApplicationContext.log Initializing Spring root WebApplicationContext 02-Jun-2017 13:26:21.302 資訊 [RMI TCP Connection(3)-127.0.0.1] org.apache.catalina.core.ApplicationContext.log Initializing Spring FrameworkServlet 'springmvc' 02-Jun-2017 13:26:24.716 資訊 [http-nio-8092-exec-1] org.apache.catalina.core.ApplicationContext.log ===counterFilter do Filter==== 02-Jun-2017 13:26:24.716 資訊 [http-nio-8092-exec-1] org.apache.catalina.core.ApplicationContext.log filter2.doFilter() 02-Jun-2017 13:26:24.716 資訊 [http-nio-8092-exec-1] org.apache.catalina.core.ApplicationContext.log filter1.doFilter()

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

<code>public</code> <code>class</code> <code>EncodeFilter </code><code>implements</code> <code>Filter {</code>

<code>        </code><code>HttpServletRequest request=(HttpServletRequest)servletRequest;</code>

<code>        </code><code>HttpServletResponse response=(HttpServletResponse)servletResponse;</code>

<code>        </code><code>request.setCharacterEncoding(</code><code>"utf-8"</code><code>);</code>

<code>        </code><code>response.setCharacterEncoding(</code><code>"utf-8"</code><code>);</code>

<code>        </code><code>filterChain.doFilter(request,response);;</code>