Filter过滤器知识点整理

1 什么是Filter过滤器

  1. Filter过滤器它是JavaWeb的三大组件之一(Servlet程序,Listenter监听器,Filter过滤器)
  2. Filter过滤器它是JavaEE的规范
  3. Filter作用:拦截请求(主要应用),过滤响应

拦截请求

  • 权限检查

  • 日记操作

  • 事务管理

    ······

2 Filter初体验

在这里插入图片描述

要求:在web工程下,有一个admin目录,这个admin目录下的所有资源(html,jsp,jpg等)都必须是用户登录之后才允许访问的

实现权限检查

1 编写一个类去实现Filter接口

public class AdminFilter implements Filter {
     
     
   @Override
   public void init(FilterConfig filterConfig) throws ServletException {
     
     

   }


   //专门用来拦截请求,权限检查
   @Override
   public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
     
     
       
   }

   @Override
   public void destroy() {
     
     

   }
}

2 实现过滤方法doFilter

//专门用来拦截请求,权限检查
   @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){
     
     
           //请求转发
           servletRequest.getRequestDispatcher("login.jsp").forward(servletRequest,servletResponse);
           return;
       }else{
     
     
           //让程序继续往下访问用户目标资源
           filterChain.doFilter(servletRequest,servletResponse);
       }
   }

3 配置web.xml文件,配置拦截路径

   <!--filter标签用来配置一个Filter过滤器-->
   <filter>
       <!--给filter起一个别名-->
       <filter-name>AdminFilter</filter-name>
       <!--配置filter的全类名-->
       <filter-class>com.gw.filter.AdminFilter</filter-class>
   </filter>
   <!--配置filter过滤器的拦截路径-->
   <filter-mapping>
       <!--表示当前拦截路径给哪个filter使用-->
       <filter-name>AdminFilter</filter-name>
       <!--url-pattern 配置拦截路径-->
       <!-- / 表示请求地址为: http://ip:port/工程路径/ (web目录) -->
       <!--/admin/* 表示请求地址为:http://ip:port/工程路径/admin/* (*表示目录下所有文件)-->
       <url-pattern>/admin/*</url-pattern>
   </filter-mapping>

此时因为还没有用户登录的信息,我们访问admin目录下的资源文件时会自动转发到登录页面,实现了权限检查


完整的用户登录和权限检查

模拟有用户登录信息的时候

完善login.jsp

<body>
这是登录页面,login.jsp
   <form action="http://localhost:8080/15_filter/loginServlet" method="get"><br>
       用户名: <input type="text" name="username"><br>
       密  码:  <input type="password" name="password"><br>
       <input type="submit" value="提交">
   </form>
</body>

添加LoginServlet程序

public class LoginServlet extends HttpServlet {
     
     
   protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     
     

   }

   protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     
     

       response.setContentType("text/html; charset=UTF-8");

       String username = request.getParameter("username");
       String password = request.getParameter("password");

       if ("abc123".equals(username) && "123456".equals(password)){
     
     
           request.getSession().setAttribute("user",username);
           response.getWriter().write("登陆成功");
       }else{
     
     
           request.getRequestDispatcher("/login.jsp").forward(request,response);
       }
   }
}

web.xml配置LoginServlet

   <servlet>
       <servlet-name>LoginServlet</servlet-name>
       <servlet-class>com.gw.servlet.LoginServlet</servlet-class>
   </servlet>
   <servlet-mapping>
       <servlet-name>LoginServlet</servlet-name>
       <url-pattern>/loginServlet</url-pattern>
   </servlet-mapping>

当用户登录成功,我们再次访问admin目录下的资源文件时,就可以访问到了

3 Filter生命周期

  1. 构造器方法

        public AdminFilter(){
          
          
             System.out.println("构造器方法");
        }
    
  2. init初始化方法

        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
          
          
            System.out.println("初始化方法");
        }
    

    上面两个方法在web工程启动时执行


  3. doFilter过滤方法

     public void doFilter
    

    每次拦截到请求时执行


  4. destroy方法

        @Override
        public void destroy() {
          
          
            System.out.println("销毁方法");
        }
    

    停止web工程的时候,就会执行(也会销毁Filter过滤器)


4 FilterConfig

Tomcat每次创建Filter的时候,也会同时创建一个FilterConfig类,这里包含了配置文件的配置信息

FilterConfig类的作用就是获取filter过滤器的配置内容

  • 获取Filter的名称 filter-name 的内容
  • 获取在Filter 中配置的 init-param初始化参数
  • 获取ServletContext对象
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    
    
//        System.out.println("初始化方法");

         //1 获取Filter的名称 filter-name 的内容
        System.out.println("filter-name:" +filterConfig.getFilterName());
        // 2 获取在Filter 中配置的 `init-param`初始化参数
        System.out.println("初始化参数:username:"+filterConfig.getInitParameter("username"));
        System.out.println("初始化参数:url:"+ filterConfig.getInitParameter("url"));
        // 3 获取`ServletContext`对象
        System.out.println(filterConfig.getServletContext());
    }

5 FilterChain多个过滤器执行的细节

在这里插入图片描述

  • 多个Filter过滤器执行的时候,它们的优先顺序是由它们在web.xml文件配置的顺序决定的

  • filterChain.doFilter()是继续执行请求资源文件的请求,也就会跳转到下一个Filter过滤器(由外到内),当访问到资源文件之后,就会(由内到外)的执行各个Filter过滤器的后置代码

6 Filter拦截路径

  1. 精确匹配(精确到一个文件)

    <url-pattern>/target.jsp</url-pattern>
    

    http://ip:port/工程路径/target.jsp

  2. 目录匹配(匹配一个目录下的文件)

    <url-pattern>/admin/*</url-pattern>
    

    http://ip:port/工程路径/admin/*

  3. 后缀名匹配

    <url-pattern>*.html</url-pattern>
    

    表示请求地址必须为.html结尾才会拦截

    注意

    <url-pattern>*.abc</url-pattern>
    
    • 只要是以配置的类型结尾就行,不需要是这种类型一定的存在的,我们在地址栏请求时只要是配置的类型就可以

    • 不能以 / 打头

    • Filter过滤器它只关心请求的地址是否存在,不关心请求的资源是否存在

猜你喜欢

转载自blog.csdn.net/weixin_46250447/article/details/112426105
今日推荐