JavaWeb零基础入门之Filter过滤器

学完之后学习JavaWeb零基础入门之JSON和AJAX
视频链接:https://www.bilibili.com/video/BV1Y7411K7zz?p=1
参考手册:https://tool.oschina.net/apidocs/apidoc?api=javaEE6

一、Filter过滤器的介绍

  1. Filter过滤器是JavaWeb三大组件之一,其余组件是:Servlet程序、Listener监听器
  2. Filter过滤器是JavaEE规范,也就是一个接口
  3. Filter过滤器的作用是:拦截请求、过滤响应

二、Filter过滤器的使用

  1. Filter过滤器的使用步骤:

    • 编写一个类实现Filter接口 (导入的包为:javax.servlet.Filter)
    • 实现三个方法:
      • 实现过滤方法doFilter(),此方法中的:filterChain.doFilter(servletRequest,servletResponse);只有执行此方法,才可以访问拦截路径中的资源,若未执行此方法则代表拦截
      • 实现init()方法
      • 实现destroy()方法(3) 到web.xml中配置Filter的拦截路径
  2. Filter过滤器的工作流程:

JavaWeb零基础入门之Filter过滤器_第1张图片

  1. 案例:在web目录下有一个Admin目录,此目录下的所有资源都必须用户登录之后才可访问,若没有登录,则跳转到登录页面

    分析: 用户登录之后会把登录信息保存到Session域中,所以检查用户是否登录,可以判断Session 中是否包含用户的登录信息即可

  2. 代码演示

    • 创建LoginServlet程序

      public class LoginServlet implements Filter {
               
          @Override
          public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
               
              HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
              HttpSession session = httpServletRequest.getSession();
              Object user = session.getAttribute("user");
              //如果等于null,说明还没有登录
              if (user == null) {
                  httpServletRequest.getRequestDispatcher("/login.jsp").forward(servletRequest,servletResponse);
              } else {
               
                  //登录成功,可以访问Admin目录下的目标资源
               filterChain.doFilter(servletRequest,servletResponse);
              }
          }
          @Override
          public void init(FilterConfig filterConfig) throws ServletException {
                }
          @Override
          public void destroy() {
                }
      }
      
    • 在web.xml中编写配置

      
      <filter>
          <filter-name>LoginServletfilter-name>
          <filter-class>com.qizegao.Filter.LoginServletfilter-class>
      filter>
      <filter-mapping>
          <filter-name>LoginServletfilter-name>
          
          
          
          <url-pattern>/Admin/*url-pattern>
      filter-mapping>
      
    • 运行结果:
      直接在浏览器输入:http://localhost:8080/MyTest/Admin/a.jsp,跳转到login.jsp,无法访问a.jsp

  3. 注意:

    • Filter过滤器也支持注解,在首行加@WebFilter(“拦截路径”),则无需web.xml文件
    • 浏览器不能直接访问实现Filter接口的类,只需访问拦截路径,就会自动的触发doFilter方法

三、Filter过滤器的生命周期

  1. 构造器方法,在web工程启动的时候执行(即在创建Filter过滤器)
  2. init初始化方法,在web工程启动的时候执行(即在创建Filter过滤器)
  3. doFilter方法 (其中有chain.doFilter方法),符合拦截路径的请求发送到服务器的时候,自动的执行,若请求不属于拦截路径,则不会执行
  4. destroy方法,停止web工程的时候执行(停止web工程,也会销毁Filter过滤器)

四、FilterConfig类

  1. FilterConfig类是Filter过滤器的配置文件类,每次创建Filter的时候,也会创建一个FilterConfig类,其中包含了Filter配置文件的配置信息

  2. FilterConfig类的作用是获取Filter过滤器的配置文件内容:

    • 获取Filter的名称,即web.xml文件中标签的值:filterConfig.getFilterName();

    • 获取web.xml文件中标签的值(写在filter标签中,可写多个),如:

    • 获取ServletContext对象:filterConfig.getServletContext()

五、FilterChain过滤器链

  1. 作用:解决多个过滤器如何一起工作

JavaWeb零基础入门之Filter过滤器_第2张图片

  1. 注意:

    • 上述两个Filter拦截的资源路径相同,代表一定会执行两个Filter过滤器的doFilter方法, 但因为手动注释不一定执行其中的chain.doFilter方法
    • 如果两个Filter拦截资源不同,且拦截资源符合Filter1,不符合Filter2,则会执行Filter1 的doFilter方法,且执行其中的chain.doFilter方法时,不会去执行Filter2的doFilter方法, 直接去访问资源,之后执行Filter1的后置代码(在chain.doFilter之后的均是后置代码)
    • 如果请求的资源不符合过滤器1和2的拦截路径,两个doFilter方法都不执行
    • 前置代码、chain.doFilter方法、后置代码都在doFilter方法中

六、Filter的拦截路径

  1. 精确匹配:/target.jsp
    表示请求的地址必须为http://ip:port/工程路径/target.jsp,才可以触发doFilter方法

  2. 目录匹配:/admin/*
    表示请求的地址必须为http://ip:port/工程路径/admin/目录下所有的文件,才可以触发doFilter方法

  3. 后缀名匹配

    *.html
    表示请求地址必须以.html结尾才可以触发doFilter方法

    *.jsp
    表示请求地址必须以.jsp结尾才可以触发doFilter方法

  4. 注意:Filter过滤器只关心请求的地址是否符合拦截路径,不会关心请求的资源是否存在

  5. 代码演示:FilterChain过滤器链的使用

    • 在Admin目录下创建a.jsp

      <%
      	system.out.println("a.jsp被访问到了");
      %>
      
    • 创建两个Filter过滤器

      public class Filter1 implements Filter {
               
          public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
               
              System.out.println("Filter1的前置代码执行");
              chain.doFilter(req, resp);
              System.out.println("Filter1的后置代码执行");
          }
      }
      
      public class Filter2 implements Filter {
               
          public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
               
              System.out.println("Filter2的前置代码执行");
              chain.doFilter(req, resp);
              System.out.println("Filter2的后置代码执行");
          }
      }
      
    • 在web.xml中编写配置

      
      <filter>
        <filter-name>Filter1filter-name>
        <filter-class>com.qizegao.Filter.Filter1filter-class>
      filter>
      <filter-mapping>
        <filter-name>Filter1filter-name>
        <url-pattern>/Admin/*url-pattern>
      filter-mapping>
      <filter>
        <filter-name>Filter2filter-name>
        <filter-class>com.qizegao.Filter.Filter2filter-class>
      filter>
      <filter-mapping>
        <filter-name>Filter2filter-name>
        <url-pattern>/Admin/*url-pattern>
      filter-mapping>
      
    • 运行结果:
      在浏览器地址栏输入:http://localhost:8080/MyTest/Admin/a.jsp
      控制台输出:JavaWeb零基础入门之Filter过滤器_第3张图片

你可能感兴趣的:(JavaWeb学习,找工作前的自救,filter,servlet)