天天看点

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>