• D17 Sping Boot 入门 Sping框架--Java Web之Filter过滤器


    一、什么是过滤器

      ①、Filter过滤器是JavaWeb的三大组件之一。三大组件分别是Servlet程序、Listener监听器、Filter过滤器

      ②、Filter过滤器是JavaEE的规范,即接口。

      ③、Filter过滤器的作用是:拦截请求(主要)、过滤响应。

      拦截请求常见的应用场景:

        1、权限检查

        2、日记操作

        3、事务管理

        4、……等等

    二、Filter的初体验

      要求:在你的web工程下有一个admin目录。admin目录下的所有资源(HTML页面,图片文件、jsp等等)必须是用户登录后才能允许访问

        思考:用户登录后把用户信息保存到Session域中,所以检查用户是否登录,可以判断Session域中是否包含用户登录信息即可。

     

    在src中新建com.gychen.filter

    在filter里新建AdminFilter.java类

    在web.xml里配置路径

     1 package com.gychen.filter;
     2 
     3 import javax.servlet.*;
     4 import javax.servlet.http.HttpServletRequest;
     5 import javax.servlet.http.HttpSession;
     6 import java.io.IOException;
     7 
     8 public class AdminFilter implements Filter {
     9     @Override
    10     public void init(FilterConfig filterConfig) throws ServletException {
    11 
    12     }
    13 
    14     /**
    15      * doFilter方法,专门用于拦截请求(可以做权限检查)、过滤响应。
    16      * @param servletRequest
    17      * @param servletResponse
    18      * @param filterChain
    19      * @throws IOException
    20      * @throws ServletException
    21      */
    22     @Override
    23     public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    24         HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
    25         HttpSession session = httpServletRequest.getSession();
    26         Object user = session.getAttribute("user");
    27         // 如果等于null,说明还没有登录
    28         if (user == null){
    29             servletRequest.getRequestDispatcher("/login.jsp").forward(servletRequest,servletResponse);
    30             return;
    31         }else {
    32             // 让程序继续往下访问用户的目标资源
    33             filterChain.doFilter(servletRequest,servletResponse);
    34         }
    35     }
    36 
    37     @Override
    38     public void destroy() {
    39 
    40     }
    41 }
    AdminFilter.java
     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
     3          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     4          xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
     5          version="4.0">
     6     
     7     
     8     
     9     <!--filter标签用于配置一个filter过滤器-->
    10     <filter>
    11         <!--给filter起一个别名-->
    12         <filter-name>AdminFilter</filter-name>
    13         <!--配置filter全类名-->
    14         <filter-class>com.gychen.filter.AdminFilter</filter-class>
    15     </filter>
    16 
    17     <!--filter-mapping配置Filter过滤器的拦截路径-->
    18     <filter-mapping>
    19         <!--filter-name表示当前的拦截路径给那个filter使用-->
    20         <filter-name>AdminFilter</filter-name>
    21         <!--url-pattern配置拦截路径
    22             / 表示请求地址为:http://ip:port/工程路径/   映射到web目录
    23         -->
    24         <!-- /admin/* 表示请求地址为:http://ip:port/工程路径/admin/* -->
    25         <url-pattern>/admin/*</url-pattern>
    26     </filter-mapping>
    27 </web-app>
    web.xml

     Filter过滤器使用步骤:

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

      2、实现过滤方法doFilter()。

      3、在web.xml中配置Filter的拦截路径。

     三、Filter的生命周期

       Filter的生命周期包含几个方法:

        ①、构造器方法

        ②、init初始化方法

          ①和②在web工程启动时执行(Filter已经创建)

        ③、doFilter过滤方法

          ③,每次拦截到请求就会执行

        ④、destroy方法

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

    四、FilterConfig类

     

     五、FilterChain 过滤器链

     在com.gychen.filter中新建两个filter来验证上述原理

    在web.xml中配置filter过滤配置路径

     1 package com.gychen.filter;
     2 
     3 import javax.servlet.*;
     4 import java.io.IOException;
     5 
     6 public class Filter1 implements Filter {
     7 
     8     @Override
     9     public void init(FilterConfig filterConfig) throws ServletException {
    10 
    11     }
    12 
    13     @Override
    14     public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    15 
    16         System.out.println("Filter1 前置代码");
    17         filterChain.doFilter(servletRequest,servletResponse);
    18         System.out.println("Filter1 后置代码");
    19     }
    20 
    21     @Override
    22     public void destroy() {
    23 
    24     }
    25 }
    Filter1
     1 package com.gychen.filter;
     2 
     3 import javax.servlet.*;
     4 import java.io.IOException;
     5 
     6 public class Filter2 implements Filter {
     7 
     8     @Override
     9     public void init(FilterConfig filterConfig) throws ServletException {
    10 
    11     }
    12 
    13     @Override
    14     public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    15 
    16         System.out.println("Filter2 前置代码");
    17         filterChain.doFilter(servletRequest,servletResponse);
    18         System.out.println("Filter2 后置代码");
    19     }
    20 
    21     @Override
    22     public void destroy() {
    23 
    24     }
    25 }
    Filter2
     1  <filter>
     2         <filter-name>Filter1</filter-name>
     3         <filter-class>com.gychen.filter.Filter1</filter-class>
     4     </filter>
     5     <filter-mapping>
     6         <filter-name>Filter1</filter-name>
     7         <url-pattern>/target.jsp</url-pattern>
     8     </filter-mapping>
     9 
    10     <filter>
    11         <filter-name>Filter2</filter-name>
    12         <filter-class>com.gychen.filter.Filter2</filter-class>
    13     </filter>
    14     <filter-mapping>
    15         <filter-name>Filter2</filter-name>
    16         <url-pattern>/target.jsp</url-pattern>
    17     </filter-mapping>

    六、Filter的拦截路径

    --精确匹配

    <url-pattern>/target.jsp</url-pattern>
    以上配置的路径,表示请求地址必须为:http://ip:port/工程路径/target.jsp

    --目录匹配

    <url-pattern>/admin/*</url-pattern>
    以上配置的路径,表示请求地址必须为:http://ip:port/工程路径/admin/*

    --后缀名匹配

    <url-pattern>*.html</url-pattern>
    以上配置的路径,表示请求地址必须以.html 结尾才会拦截到
    <url-pattern>*.do</url-pattern>
    以上配置的路径,表示请求地址必须以.do 结尾才会拦截到
    <url-pattern>*.action</url-pattern>
     
    以上配置的路径,表示请求地址必须以.action 结尾才会拦截到
    Filter 过滤器它只关心请求的地址是否匹配,不关心请求的资源是否存在!!!

  • 相关阅读:
    电子邮件为什么要编码以及产生乱码的原因?
    UTF8国际通用为什么还要用GBK?
    python 调用shell命令的方法
    script —— 终端里的记录器
    IP数据报是如何在网络中转发的?
    网际协议:无连接数据报交付(IPv4)
    fork与vfork
    strlen与sizeof有什么区别?
    网络地址到物理地址的映射(ARP)
    分类的因特网地址
  • 原文地址:https://www.cnblogs.com/nuister/p/13060371.html
Copyright © 2020-2023  润新知