JavaWeb过滤器Filter

Filter也称为过滤器,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp,Servlet,
静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制,页面的同一编码,过滤敏感词汇、压缩响应信息等一些高级功能!

Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter。通过Filter技术,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截。简单说,就是可以实现web容器对某资源的访问前截获进行相关的处理,还可以在某资源向web容器返回响应前进行截获进行处理。

看一下filter中有哪些方法!

<span style="font-size:18px;">public class Demo1Filter implements Filter {
    //Filter 链的执行
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
    }
    //Init 方法在 Filter 生命周期中仅执行一次,web 容器在调用 init 方法时
    public void init(FilterConfig filterConfig) throws ServletException {
    }
    //在Web容器卸载 Filter 对象之前被调用。该方法在Filter的生命周期中仅执行一次。在这个方法中,可以释放过滤器使用的资源。
    public void destroy() {
    }
}
</span>

我们先来看一下在访问资源的时候,他的执行过程!

在我们的web容器启动时在 web
应用程序启动时,web 服务器将根据 web.xml
文件中的配置信息来创建每个注册的 Filter
实例对象,并将其保存在服务器的内存中。然后当用户用浏览器请求一个页面的时候, 会先向web的容器发送一个请求,然后web容器在根据请求去找相应的资源!在找资源的时候,会先经过Filter,然后在继续向后执行,一个应用程序中可以有多个filter!filter 的执行的顺序跟在web.xml文件中配置的顺序是一样的!

下边我们通过一个实例来看一下filter是如何应用的!

web.xml配置

<!-- 编码过滤器 -->
    <filter>
        <filter-name>setCharacterEncoding</filter-name>
        <filter-class>com.company.strutstudy.web.servletstudy.filter.EncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>utf-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>setCharacterEncoding</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>   

<!-- 请求url日志记录过滤器 -->
    <filter>
        <filter-name>logfilter</filter-name>
        <filter-class>com.company.strutstudy.web.servletstudy.filter.LogFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>logfilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>  

编码拦截器:

public class EncodingFilter implements Filter {
    private String encoding;
    private Map<String, String> params = new HashMap<String, String>();
    // 项目结束时就已经进行销毁
    public void destroy() {
        System.out.println("end do the encoding filter!");
        params=null;
        encoding=null;
    }
    public void doFilter(ServletRequest req, ServletResponse resp,
            FilterChain chain) throws IOException, ServletException {
        //UtilTimerStack.push("EncodingFilter_doFilter:");
        System.out.println("before encoding " + encoding + " filter!");
        req.setCharacterEncoding(encoding);
        // resp.setCharacterEncoding(encoding);
        // resp.setContentType("text/html;charset="+encoding);
        chain.doFilter(req, resp);
        System.out.println("after encoding " + encoding + " filter!");
        System.err.println("----------------------------------------");
        //UtilTimerStack.pop("EncodingFilter_doFilter:");
    }   

    // 项目启动时就已经进行读取
    public void init(FilterConfig config) throws ServletException {
        System.out.println("begin do the encoding filter!");
        encoding = config.getInitParameter("encoding");
        for (Enumeration e = config.getInitParameterNames(); e
                .hasMoreElements();) {
            String name = (String) e.nextElement();
            String value = config.getInitParameter(name);
            params.put(name, value);
        }
    }
 }  

日志拦截器:

public class LogFilter implements Filter {
    FilterConfig config;   

    public void destroy() {
        this.config = null;
    }   

    public void doFilter(ServletRequest req, ServletResponse res,
            FilterChain chain) throws IOException, ServletException {
        // 获取ServletContext 对象,用于记录日志
        ServletContext context = this.config.getServletContext();
        //long before = System.currentTimeMillis();
        System.out.println("before the log filter!");
        //context.log("开始过滤");
        // 将请求转换成HttpServletRequest 请求
        HttpServletRequest hreq = (HttpServletRequest) req;
        // 记录日志
        System.out.println("Log Filter已经截获到用户的请求的地址:"+hreq.getServletPath() );
        //context.log("Filter已经截获到用户的请求的地址: " + hreq.getServletPath());
        try {
            // Filter 只是链式处理,请求依然转发到目的地址。
            chain.doFilter(req, res);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("after the log filter!");
        //long after = System.currentTimeMillis();
        // 记录日志
        //context.log("过滤结束");
        // 再次记录日志
        //context.log(" 请求被定位到" + ((HttpServletRequest) req).getRequestURI()
        //      + "所花的时间为: " + (after - before));
    }   

    public void init(FilterConfig config) throws ServletException {
        System.out.println("begin do the log filter!");
        this.config = config;
    }   

 }   

HelloServlet类:

public class HelloWorldServlet extends HttpServlet{   

    /**
     * 查看httpservlet实现的service一看便知,起到了一个controll控制器的作用(转向的)
     * 之后便是跳转至我们熟悉的doget,dopost等方法中
     */
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        System.out.println("doservice..."+this.getInitParameter("encoding"));   

        super.service(req, resp);
    }   

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        System.out.println("doget...");
        doPost(req, resp);
    }   

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        System.out.println("dopost...");
    }

结果:

before encoding utf-8 filter!
  before the log filter!
  Log Filter已经截获到用户的请求的地址:/hello
  doservice...UTF-8
  doget...
  dopost...
  after the log filter!
  after encoding utf-8 filter!
  ----------------------------------------

Filter生命周期

  和Servlet一样Filter的创建和销毁也是由WEB服务器负责。不过与Servlet区别的是

1>在应用启动的时候就进行装载Filter类(与Servlet的load-on-startup配置效果相同)。

2>容器创建好Filter对象实例后,调用init()方法。接着被Web容器保存进应用级的集合容器中去了等待着,用户访问资源。

3>当用户访问的资源正好被Filter的url-pattern拦截时,容器会取出Filter类调用doFilter方法,下次或多次访问被拦截的资源时,Web容器会直接取出指定Filter对象实例调用doFilter方法(Filter对象常驻留Web容器了)。

4>当应用服务被停止或重新装载了,则会执行Filter的destroy方法,Filter对象销毁。

注意:init方法与destroy方法只会直接一次。

时间: 2024-10-26 21:45:33

JavaWeb过滤器Filter的相关文章

JavaWeb的Filter过滤器

过滤器Filter 过滤器概述 什么是过滤器 过滤器JavaWeb三大组件之一,它与Servlet很相似!不过滤器是用来拦截请求的,而不是处理请求的. 当用户请求某个Servlet时,会先执行部署在这个请求上的Filter,如果Filter"放行",那么会继承执行用户请求的Servlet:如果Filter不"放行",那么就不会执行用户请求的Servlet. 其实可以这样理解,当用户请求某个Servlet时,Tomcat会去执行注册在这个请求上的Filter,然后是否

JavaWeb学习篇之----Servlet过滤器Filter和监听器

JavaWeb学习篇之----Servlet过滤器Filter和监听器 首先来看一下Servlet的过滤器内容: 一.Servlet过滤器的概念: *************************************************************************************** Servlet过滤器是在Java Servlet规范2.3中定义的,它能够对Servlet容器的请求和响应对象进行检查和修改. Servlet过滤器本身并不产生请求和响应对象,

【JavaWeb学习】过滤器Filter

一.简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能.例如实现URL级别的权限访问控制.过滤敏感词汇.压缩响应信息等一些高级功能. Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter.通过Filter技

深入分析JavaWeb Item36 -- 过滤器Filter高级应用

在filter中可以得到代表用户请求和响应的request.response对象,因此在编程中可以使用Decorator(装饰器)模式对request.response对象进行包装,再把包装对象传给目标资源,从而实现一些特殊需求. 一.Decorator设计模式 1.1.Decorator设计模式介绍 当某个对象的方法不适应业务需求时,通常有2种方式可以对方法进行增强: 编写子类,覆盖需增强的方法. 使用Decorator设计模式对方法进行增强. 使用代理 在阎宏博士的<JAVA与模式>一书中

javaweb-Servlet过滤器Filter

一.在javaweb学习中javaweb过滤器是一个非常重要的学习内容在web开发阶段的中Javaweb过滤器可以很好的优化代码,同时减少许多不必要的代码,将代码很好的集合在一起,这样的操作可以减少许多不必要的代码,同时大大的减少程序的运行. 二.正对于javaweb的过滤器Filter可以从以下几个方面进行讲解 1.Javaweb的概念 javaweb是一个服务器组键,他可以截取用户端的请求以及响应的信息,并且对信息进行过滤. 2.过滤器的api  Servlet过滤器API包含了3个接口,它

JavaWeb--Servlet过滤器Filter和SpringMVC的HandlerInterceptor(Session和Cookie登录认证)

拦截一些请求进行处理,比如通过它来进行权限验证,或者是来判断用户是否登陆,日志记录,编码,或者限制时间点访问等等,是非常有必要的.所以就有了此篇文章啦. 文章结构:(1)Servlet过滤器Filter:(2)SpringMVC的HandlerInterceptor:(3)对比认知. 一.Servlet过滤器Filter: 此部分是从赵四大佬那里学来的,并补充自己的认知 (1)概念: 能够对Servlet容器的请求和响应对象进行检查和修改. Servlet过滤器本身并不产生请求和响应对象,它只能

JAVA学习篇--javaweb之Filter详解

在DRP项目中,多次提到了Filter,它解决了字符集的统一设置以及统一控制简单WebCache,从中我们可以体会到,它给我们带来的好处不仅仅是减少代码量这么简单,它的出现避免了我们每个页面重复的编写相同的代码,减少了我们的工作量,而且给维护带来了极大的便利,那么它是如何实现统一管理的呢?既然它能统一管理某些重复的操作,那么它和AOP有什么关系呢? Filter简介 ServletAPI中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过

javaweb之Filter详解

一.概念:Filter也称之为过滤器,它是Servlet技术中比较激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能.例如实现URL级别的权限访问控制.过滤敏感词汇.压缩响应信息等一些高级功能. 二.Filter简介Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filte

JavaWEB过滤器和监听器技术

过滤器介绍 什么是过滤器 生活中的例子: 滤水器,口罩,杯子上滤网,渔网 生活中的过滤器:留下我们想要的,排除,我们不想要的. 高考: 只有分数够高的同学才能进入理想的大学.有一部分同学被拦截在大学之外.(起到拦截的作用) 传智播客: 一开始大家都是小白,进入传智播客学习,经历了4个月的学习,毕业之后,具有了一定(月薪10000左右)的编码能力. (对每一个经过的学员,都增强了学员的编码能力,起到了增强的作用) JavaWeb中的过滤器的概念: 对请求和响应进行拦截或者增强的对象,就是过滤器.