Filtrar puntos de conocimiento finalizando

1 ¿Qué es el filtro?

  1. El filtro es uno JavaWebde los tres componentes principales ( Servletprograma, Listenteroyente, Filterfiltro)
  2. FilterFiltrar es JavaEEla especificación
  3. FilterRol: solicitud de intercepción (aplicación principal), respuesta de filtro

Solicitud de interceptación

  • Verificación de permisos

  • Operación de diario

  • Gestión de transacciones

    ······

2 Filtrar primera experiencia

Inserte la descripción de la imagen aquí

Requisitos: Bajo el proyecto web, hay un admindirectorio, se debe permitir el acceso a admintodos los recursos ( html,jsp,jpgetc.) en este directorio después de que el usuario inicie sesión.

Implementar verificación de permisos

1 Escriba una clase para implementar la interfaz de filtro

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 Implementar el método de filtradodoFilter

//专门用来拦截请求,权限检查
   @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.xmlArchivo de configuración, configurar la ruta de interceptación

   <!--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>

En este momento, debido a que aún no hay información de inicio de sesión del usuario, lo adminreenviaremos automáticamente a la página de inicio de sesión cuando accedamos a los archivos de recursos en el directorio, que realiza la verificación de permisos


Verificación completa de inicio de sesión y permisos de usuario

Simular cuando hay información de inicio de sesión del usuario

Perfectologin.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>

Agregar LoginServletprograma

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.xmlConfiguraciónLoginServlet

   <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>

Cuando el usuario inicia sesión correctamente y accedemos a adminlos archivos de recursos en el directorio nuevamente , podemos acceder

3 Ciclo de vida del filtro

  1. Método constructor

        public AdminFilter(){
          
          
             System.out.println("构造器方法");
        }
    
  2. initMétodo de inicialización

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

    Los dos métodos anteriores se ejecutan cuando se inicia el proyecto web


  3. doFilterMétodo de filtrado

     public void doFilter
    

    Ejecutar cada vez que se intercepta una solicitud


  4. destroymétodo

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

    Cuando se detenga el proyecto web, se ejecutará (el filtro también se destruirá)


FilterConfigTipo 4

Cada vez que Tomcat crea un filtro, también crea una FilterConfigclase, que contiene la información de configuración del archivo de configuración.

FilterConfigEl papel de la clase es obtener el contenido de configuración del filtro filtro

  • Obtener el nombre del contenido del nombre del filtro del filtro
  • Obtener configuración en los init-paramparámetros de inicialización del filtro
  • Obtener ServletContextobjeto
    @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 FilterChaindetalles de la implementación de múltiples filtros

Inserte la descripción de la imagen aquí

  • Cuando se ejecutan varios filtros, su orden de prioridad está determinado por el orden en el que están web.xmlconfigurados en el archivo.

  • filterChain.doFilter()Es continuar ejecutando la solicitud para solicitar el archivo de recursos, y saltará al siguiente filtro de filtro (de afuera hacia adentro). Cuando se acceda al archivo de recursos, se ejecutará (de adentro hacia afuera) después de cada filtro de filtro. . Establecer código

6 Ruta de interceptación de filtros

  1. Coincidencia exacta (precisa para un archivo)

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

    http: // ip: puerto / ruta del proyecto / target.jsp

  2. Coincidencia de directorio (archivos coincidentes en un directorio)

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

    http: // ip: puerto / ruta del proyecto / admin / *

  3. Coincidencia de nombre de sufijo

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

    Indica que la dirección de la solicitud debe terminar en .html para ser interceptada

    Nota

    <url-pattern>*.abc</url-pattern>
    
    • Siempre que termine con el tipo de configuración, no es necesario que sea de este tipo, solo debemos ser el tipo de configuración cuando solicitemos la barra de direcciones

    • No se puede empezar con /

    • Filtro Solo se preocupa por la existencia de la dirección solicitada, no por la existencia del recurso solicitado

Supongo que te gusta

Origin blog.csdn.net/weixin_46250447/article/details/112426105
Recomendado
Clasificación