2.3.5 Ciclo de vida de filtro y escucha, ruta de interceptación, cadena de filtro, creación y destrucción de monitores de tres dominios principales

Tabla de contenido

Una descripción general del filtro

Dos inicio rápido

Tres principios de funcionamiento

Cuatro detalles de uso

4.1 Ciclo de vida

4.2 Ruta de interceptación

4.3 Cadena de filtros

Cinco casos integrales

5.1 Comentarios de usuario

5.1.1 Análisis de demanda

5.1.2 Implementación del código

5.2 Codificación uniforme de sitios web

5.2.1 Análisis de demanda

5.2.2 Implementación del código

Oyente 【Entender】

1.1 Resumen

1.2 Inicio rápido


 

Una descripción general del filtro

Filtros en la vida diaria
Purificadores de agua, purificadores de aire, controles de seguridad del metro, Sunda King

Filtros en la web
Cuando los usuarios acceden a los recursos del servidor, el filtro intercepta la solicitud y completa algunas operaciones comunes

Escenarios de aplicación
como: verificación de inicio de sesión, procesamiento de codificación unificado, filtrado de caracteres confidenciales

 

Dos inicio rápido

Requisitos: escribir un filtro para interceptar el servlet de recursos de destino


public class TargetServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("目标资源被访问到了.....");

        resp.setContentType("text/html;charset=utf-8");
        resp.getWriter().write("目标资源被访问到了.....");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
<!--TargetServlet-->
    <servlet>
        <servlet-name>TargetServlet</servlet-name>
        <servlet-class>com.lagou.servlet.TargetServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>TargetServlet</servlet-name>
        <url-pattern>/targetServlet</url-pattern>
    </servlet-mapping>


① Escriba la clase Java e implemente la interfaz de filtro

package com.lagou.filter;

import javax.servlet.*;
import java.io.IOException;

public class QuickFilter implements Filter {

    /*
        初始化方法
     */
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    /*
        拦截用户请求的方法
        servletRequest: 请求对象
        servletResponse:响应对象
        filterChain:过滤器链(是否放行)
     */
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

        System.out.println("QuickFilter拦截了请求....");
        // 没有以下语句时, 不放行
        // 放行状态
        filterChain.doFilter(servletRequest,servletResponse);

        // 再进行拦截
        System.out.println("QuickFilter拦截了响应....");
    }

    /*
        销毁方法
     */
    @Override
    public void destroy() {

    }
}

 

② Configurar web.xml

<!--QuickFilter-->
    <filter>
        <filter-name>QuickFilter</filter-name>
        <filter-class>com.lagou.filter.QuickFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>QuickFilter</filter-name>
        <!-- 该拦截器的拦截路径 /*  -->
        <url-pattern>/targetServlet</url-pattern>
    </filter-mapping>

Tres principios de funcionamiento

 

Cuatro detalles de uso

4.1 Ciclo de vida

Ciclo de vida: se refiere a un proceso desde el nacimiento (creación) hasta la muerte (destrucción) de un objeto.


public class LifecycleFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("LifecycleFilter对象创建了...执行init方法");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("LifecycleFilter对象拦截了请求...执行doFilter方法");
        filterChain.doFilter(servletRequest,servletResponse);
    }

    @Override
    public void destroy() {
        System.out.println("LifecycleFilter对象销毁了了...执行destroy方法");
    }
}

 

 

4.2 Ruta de interceptación

Durante el desarrollo, podemos especificar la ruta de interceptación del filtro para definir el alcance de la interceptación de los recursos objetivo.

 

 

4.3 Cadena de filtros

En una solicitud, si nuestra solicitud coincide con varios filtros, pasar la solicitud es equivalente a encadenar estos filtros para formar una cadena de filtros.


public class AFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("AFilter拦截请求");
        //放行
        filterChain.doFilter(servletRequest,servletResponse);
        // 对响应进行增强
        System.out.println("AFilter响应增强");
    }

    @Override
    public void destroy() {

    }
}

public class BFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("BFilter拦截请求");
        //放行
        filterChain.doFilter(servletRequest,servletResponse);
        // 对响应进行增强
        System.out.println("BFilter响应增强");
    }

    @Override
    public void destroy() {

    }
}
<!-- B先声明, 因此B先执行 -->

<!--BFilter-->
    <filter>
        <filter-name>BFilter</filter-name>
        <filter-class>com.lagou.filter.BFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>BFilter</filter-name>
        <!--该拦截器的拦截路径 /*-->
        <url-pattern>/targetServlet</url-pattern>
    </filter-mapping>

<!--AFilter-->
    <filter>
        <filter-name>AFilter</filter-name>
        <filter-class>com.lagou.filter.AFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>AFilter</filter-name>
        <!--该拦截器的拦截路径 /*-->
        <url-pattern>/targetServlet</url-pattern>
    </filter-mapping>

 

Cinco casos integrales

5.1 Comentarios de usuario

Requisitos
Los usuarios visitan el sitio web de un foro y pueden dejar comentarios sobre el contenido de la competencia escribiendo comentarios.

5.1.1 Análisis de demanda

 

5.1.2 Implementación del código

① bbs.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h3>LPL季后赛观看留言板</h3>
    <form action="/filter_demo/wordsServlet" method="post">
        <textarea name="content" id="" cols="30" rows="10"></textarea>
          <input type="submit" value="请留言">
    </form>

</body>
</html>

② WordsServlet


public class WordsServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        // 1. 获取表单中的留言信息(获取请求参数)
        String content = req.getParameter("content");

        // 2. 将请求参数的值输出到浏览器
        resp.getWriter().write(content);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

 

 

5.2 Codificación uniforme de sitios web

La
versión de demanda tomcat8.5 ha solicitado que el chino ilegible se resuelva, pero todavía hay solicitudes de publicaciones confusas en chino
cualquier solicitud enviada por el navegador, a través del filtro tratamiento unificado Chino confuso

5.2.1 Análisis de demanda

5.2.2 Implementación del código

En la escena real, el filtro no responderá uniformemente al tipo de mímica.


public class EncodeFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

        // 类型向下转型
        HttpServletRequest request=  (HttpServletRequest) servletRequest;
        HttpServletResponse response =  (HttpServletResponse) servletResponse;

        // 判断用户发出的请求是否是post请求,是,才设置编码
        if(request.getMethod().equalsIgnoreCase("post")){
            request.setCharacterEncoding("UTF-8");
        }

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

        filterChain.doFilter(servletRequest,servletResponse);
    }

    @Override
    public void destroy() {

    }
}
<!--EncodeFilter-->
    <filter>
        <filter-name>EncodeFilter</filter-name>
        <filter-class>com.lagou.filter.EncodeFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>EncodeFilter</filter-name>
        <!--该拦截器的拦截路径 /*-->
        <url-pattern>/*</url-pattern>
    </filter-mapping>

 

Oyente 【Entender】

1.1 Resumen

Monitores en la vida
Muchos de nuestros centros comerciales tienen cámaras que monitorean cada movimiento de los clientes. Si el cliente infringe la ley, el centro comercial puede tomar las medidas correspondientes.

Oyente en javaweb
En nuestro programa java, a veces necesitamos monitorear ciertas cosas, una vez que el objeto monitoreado cambia en consecuencia, debemos tomar las acciones correspondientes.

Monitorear los tres objetos de dominio de la web: HttpServletRequest, HttpSession, ServletContext monitorear la creación y destrucción de los tres objetos de dominio a través del oyente

Escena
Visitas históricas, recuento de personas en línea, inicialización de la información de configuración al inicio del sistema

 

1.2 Inicio rápido

Los oyentes se utilizan menos en el desarrollo web y hay menos oportunidades de verlos, por lo que utilizamos ServletContextListenner para que todos aprendan sobre el oyente, porque este oyente es el que tiene la tasa de uso más alta entre los oyentes y el del oyente El uso es similar.
Podemos usar este oyente para hacer algunas cosas cuando el proyecto se inicia y se destruye, por ejemplo, para cargar el archivo de configuración cuando se inicia el proyecto.

Introducción a la API de la interfaz ServletContextListener: importante

 

Utilice el paso
1. Cree una clase para implementar la interfaz ServletContextListenner
2. Implemente los métodos contextInitialized y contextDestroyed de ServletContextListenner.
3. Configure esta clase en xml


public class MyServletContextListener implements ServletContextListener {

    /*
        监听servletContext对象创建的方法
     */
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        System.out.println("监听到servletContext对象创建了.....");
    }

    /*
        监听servletContext对象销毁的方法
     */
    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        System.out.println("监听到servletContext对象销毁了.....");
    }
}

 

La configuración de web.xml es la siguiente

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <!--配置MyServletContextListener-->
    <listener>
        <listener-class>com.lagou.listener.MyServletContextListener</listener-class>
    </listener>
    
</web-app>

 

Lo mismo es cierto
: la creación y destrucción de objetos de sesión y objetos de solicitud también se pueden monitorear de la misma manera usando las siguientes interfaces. HttpSessionListener: escucha para la creación y destrucción del dominio
Httpsession ServletRequestListener: escucha para la creación y destrucción del dominio ServletRequest

 

Supongo que te gusta

Origin blog.csdn.net/chengh1993/article/details/109899340
Recomendado
Clasificación