WEB_24【过滤器Filter】

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ccnuacmhdu/article/details/82347601

特此说明:本文参考传智播客、黑马程序员视频讲座 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

Filter快速入门

filter是对客户端访问资源的过滤,符合条件放行,不符合条件不放行,并且可以对目 标资源访问前后进行逻辑处理

package filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class FilterDemo1 implements Filter{

    public void init(FilterConfig filterConfig) throws ServletException {
        // TODO Auto-generated method stub

    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {

        System.out.println("I am Filter...");
    }

    public void destroy() {
        // TODO Auto-generated method stub

    }

}

web.xml配置:

 <filter>
    <filter-name>FilterDemo1</filter-name>
    <filter-class>filter.FilterDemo1</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>FilterDemo1</filter-name>
    <!-- 下面配置的意思是拦截所有请求 -->
    <url-pattern>/*</url-pattern>
  </filter-mapping>

书写一个servlet,并通过浏览器访问:

package servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Servlet1 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.getWriter().write("Hello, Filter...");
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

访问结果:
控制台打印:I am Filter…
Servlet1中的doGet方法并不会打印Hello, Filter…

过滤器没有对Servlet1放行!!!
在FilterDemo1的doFilter方法中增加代码chain.doFilter(request, response);把Servlet1放行,这时就会打印出Hello, Filter…

如果创建多个Filter,都配置拦截所有请求,那么一个请求被第一个Filter拦截后,继续被第二个Filter拦截!!Tomcat引擎创建的request和response依次传递给Filter的request和response参数,如果放行会传递给chain.doFilter的参数,再传递给Servlet的参数!!!

Filter的API

Filter对象的生命周期:

  • Filter何时创建:服务器启动时就创建该filter对象
  • Filter何时销毁:服务器关闭时filter销毁
public class FilterDemo1 implements Filter{

    //Filter创建的时候执行init方法
    public void init(FilterConfig filterConfig) throws ServletException {
        //filterConfig对象可以获得一些信息
        System.out.println(filterConfig.getFilterName());
        //下面这个需要自己提前配置参数
//      <filter>
//      <filter-name>FilterDemo1</filter-name>
//      <filter-class>filter.FilterDemo1</filter-class>
//      <init-param>
//          <param-name>aaa</param-name>
//          <param-value>AAA</param-value>
//      </init-param>
//    </filter>
        System.out.println(filterConfig.getInitParameter("aaa"));
        //下面这个说明Filter对象后于ServletContext对象创建
        System.out.println(filterConfig.getServletContext());


        System.out.println("Filter init...");
    }

    //下面的request是ServletRequest类型的,如果需要HttpServletRequest的方法,可以强转,response同
    //FilterChian:过滤器链对象,他知道所有Filter的顺序,通过chain.doFilter(request,response)进行放行
    //注意执行Filter的顺序是根据配置的<filter-mapping>的先后顺序进行的
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {

        System.out.println("Filter running...");

    }

    //Filter销毁的时候执行的方法
    public void destroy() {

        System.out.println("Filter destroy...");
    }

}

Filter的配置

  • 1)完全匹配 /sertvle1
  • 2)目录匹配 /aaa/bbb/* —-最多的

/user/*:访问前台的资源进入此过滤器
/admin/*:访问后台的资源时执行此过滤器

  • 3)扩展名匹配 .abc .jsp

注意:url-pattern可以使用servlet-name替代,也可以混用

<dispatcher></dispatcher>配置

dispatcher:访问的方式(了解)
REQUEST:默认值,代表直接访问某个资源时执行filter
FORWARD:转发时才执行filter
INCLUDE: 包含资源时执行filter
ERROR:发生错误时进行跳转时执行filter

应用(略)
自动登录
解决全局乱码

猜你喜欢

转载自blog.csdn.net/ccnuacmhdu/article/details/82347601