黑马程序员——javaweb中的过滤器

来源:互联网 发布:sql 超出日期范围 编辑:程序博客网 时间:2024/06/11 20:24

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流------

记得以前面试的时候被问道过Servlet和Filter的区别,我回答的并不是特别好,今天正好看到过滤器,那么我就总结一下有关过滤器的东西吧。

首先我们了解一下现实生活中的过滤器是怎么工作的。首先要有过滤源,也就是我们要过滤什么,然后要有过滤规则,之后通过过滤才有过滤结果。简单来说就是:过滤源----->过滤规则----->过滤结果。

我们的web过滤器就是用来过滤用户请求的,特别要强调的是过滤器不处理结果。来看一下过滤器的定义:过滤器是一个服务器端的组件,它可以截取用户端的请求与相应信息,并对这些信息进行过滤。

说完定义,我们就要来看一下过滤器的工作原理:首先用户发送请求给我们的过滤器,过滤器将用户的请求发送给要访问的web资源,web资源将响应发送给过滤器,过滤器再将响应发送给用户。

接下来是过滤器的生命周期:首先web容器启动之后就会根据web.xml配置文件对过滤器进行实例化,在进行实例化之后将调用过滤器的init()方法对过滤器进行初始化,我们可以通过FilterConfig参数获取web.xml中过滤器的初始化参数,当请求的URL与我们在web.xml中指定的URL匹配的时候将触发过滤器进行过滤,调用的是doFilter()方法,这个方法是过滤器的核心方法,FilterChain参数可以调用doFilter()方法,将请求传给下一个过滤器(或者目标资源),或者利用请求转发或者重定向将请求转发到其他资源,接下来就是销毁了,web容器要关闭的时候会调用destroy()方法,一般在这个方法中释放过滤器占用的资源。

接下来要提两点:

第一点,过滤器是可以改变用户请求路径的。

第二点,过滤器不可以直接返回数据,因为过滤器不能够直接处理用户请求。

下面是简单代码示例:

第一步:定义一个Filter类

package org.edu.filter;import java.io.IOException;import java.util.Enumeration;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;/** * Servlet Filter implementation class FirstFilter */public class FirstFilter implements Filter {    public FirstFilter() {       System.out.println("FirstFilter过滤器的无参构造函数");    }public void destroy() {System.out.println("FirstFilter过滤器的destroy方法");}public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {System.out.println("FirstFilter过滤器doFilter开始");chain.doFilter(request, response);System.out.println("FirstFilter过滤器doFilter结束");}public void init(FilterConfig fConfig) throws ServletException {//获取过滤器中所有的初始化参数的名称Enumeration<String> paramNames = fConfig.getInitParameterNames();while(paramNames.hasMoreElements()){String paramName = paramNames.nextElement();String paramValue = fConfig.getInitParameter(paramName);System.out.println(paramValue);}System.out.println("FirstFilter过滤器init方法");}}
第二步:在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" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">  <display-name>FilterDemo</display-name>  <welcome-file-list>    <welcome-file>index.jsp</welcome-file>  </welcome-file-list>  <filter>    <filter-name>FirstFilter</filter-name>    <filter-class>org.edu.filter.FirstFilter</filter-class>    <init-param>    <param-name>id</param-name>    <param-value>1</param-value>    </init-param>    <init-param>    <param-name>name</param-name>    <param-value>devil</param-value>    </init-param>  </filter>  <filter-mapping>    <filter-name>FirstFilter</filter-name>    <url-pattern>/*</url-pattern>    <dispatcher>REQUEST</dispatcher>  </filter-mapping></web-app>

通过这么简单的两步,我们的过滤器就可以使用了,<url-pattern>/*</url-pattern>表示过滤器将会拦截所有的请求,执行以下就可以看到结果了。

通过以上的示例,通过结果我们可以发现,Tomcat一旦start,就会先打印无参构造函数中的输出,然后打印init方法中的输出,当我们访问index.jsp的时候就会打印doFilter方法中的输出。然后当Tomcat一旦stop,就会打印destroy方法中的输出。

这里还要提一点的是在以上的示例中用的是Dynamic web module version是2.5,如果使用3.0的话,千万要注意创建Filter的时候会默认会自动添加有过过滤器的注解,添加注解之后,就不用再web.xml中中配置了,否则就会出现除了doFilter方法中的打印,其他打印都是两遍。


0 0
原创粉丝点击