Maison  >  Article  >  Java  >  Quel est le principe et la méthode d'enregistrement du filtre dans Springboot

Quel est le principe et la méthode d'enregistrement du filtre dans Springboot

WBOY
WBOYavant
2023-05-11 20:28:041382parcourir

    1. Filtre

    Regardez d'abord l'emplacement du filtre du serveur web. Le filtre est une chaîne connectée avant et après. Une fois le traitement précédent terminé, il est transmis au filtre suivant pour traitement.

    Quel est le principe et la méthode denregistrement du filtre dans Springboot

    1.1 Définition de l'interface du filtre

    public interface Filter {
        //初始化方法,整个生命周期中只执行一次。
        //在init方法成功(失败如抛异常等)执行完前,不能提供过滤服务。
        //参数FilterConfig用于获取初始化参数
        public void init(FilterConfig filterConfig) throws ServletException;
     
        //执行过滤任务的方法,参数FilterChain表示过滤器链,doFilter方法中只有执行chain.doFilter()后才能调用下一个过滤器的doFilter方法
        //才能将请求交经下一个Filter或Servlet执行
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException;
     
        //销毁方法,当移出服务时由web容器调用。整个生命周期中destroy方法只会执行一次
        //destroy方法可用于释放持有的资源,如内存、文件句柄等
        public void destroy();
    }

    Les paramètres d'entrée du filtre sont la demande et la réponse. Le filtre est généralement utilisé pour effectuer certains travaux de prétraitement, comme effectuer des inspections, des vérifications, etc. F1.2 Filtre personnalisé

    public class LoginFilter implements Filter {
        @Override
        public void destroy() {
            System.out.println("filter destroy method");
        }
        @Override
        public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain filterChain)
                throws IOException, ServletException {
            System.out.println("filter doFilter method ");
            // 继续传递下去
            filterChain.doFilter(arg0,arg1);
        }
        @Override
        public void init(FilterConfig arg0) throws ServletException {
            System.out.println("filter init method");
        }
    }

    2, enregistrement du filtre SpringBoot de plusieurs manières

    2.1 Enregistrement manuel

    @Configuration
    public class FilterConfig {
        @Bean
        public FilterRegistrationBean indexFilterRegistration() {
            FilterRegistrationBean registration = new FilterRegistrationBean(new LoginFilter());
            registration.addUrlPatterns("/");
            return registration;
        }
    }
    E

    2.2 Révision

    2.2.1 Ajouter une note sur Filter@Webfilterrrrrrrrrrrr

    @WebFilter(urlPatterns = "/",filterName = "filter1")
    @Order(1)
    public class LoginFilter implements Filter {
        @Override
        public void destroy() {
            System.out.println("filter destroy method");
        }
     
        @Override
        public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain filterChain)
                throws IOException, ServletException {
            System.out.println("filter doFilter method   1   ");
            filterChain.doFilter(arg0,arg1);
        }
     
        @Override
        public void init(FilterConfig arg0) throws ServletException {
            System.out.println("filter init method");
        }
    }

    2. 2.2.2 Ajouter l'annotation @ ServletComponentScan à la classe de démarrage

    @SpringBootApplication
    @ServletComponentScan
    public class FilterTestApplication {
        public static void main(String[] args) {
            SpringApplication.run(FilterTestApplication.class, args);
        }
    }

    Remarque :

    @ServletComponentScan analysera toutes les classes avec @WebFilter et les enregistrera en tant que servlets.

    Si la classe de démarrage n'ajoute pas cette annotation, l'ajout de l'annotation Component sur le filtre peut également être enregistrée en tant que filtre

    l'annotation d'ordre peut ajuster l'ordre des filtres

    2.3 S'inscrire via servletContext

    @Autowired ServletContext servletContext; servletContext.addFilter()

    3 Principe

    . 3.1 ServletContext

    Conteneur Web Un objet ServletContext est créé pour chaque application Web au démarrage, et cet objet ServletContext représente l'application Web actuelle.

    Un objet ServletContext représente une application Web. Tous les servlets et autres ressources de l'application Web partagent un objet ServletContext.

    Si nécessaire, nous pouvons communiquer entre les servlets via l'objet ServletContext.

    ServletContext est un espace de stockage global d'informations. Il existe au démarrage du serveur et n'est libéré que lorsque le serveur est arrêté. Un utilisateur peut avoir plusieurs requêtes : une session, une pour chaque utilisateur ; et un servletContext, tous les utilisateurs en partagent une.

    Quel est le principe et la méthode denregistrement du filtre dans Springboot

    ApplicationContext est la classe d'implémentation de ServletContext Vous pouvez voir qu'il contient des méthodes d'enregistrement correspondantes

    Obtenez ServletContext dans le programme

    3.1.1 Utiliser l'injection automatique

    @Autowired private ServletContext servletContext;

    3.1.2 requête pour. get servletContext

    ServletContext servletContext = request.getServletContext();

    3.1.3 Implémenter ServletContextListener

    @Component
    public class TestListener implements ServletContextListener {
        @Override
        public void contextInitialized(ServletContextEvent sce) {
            System.out.println(sce);
        }
    }

    3.2 ServletRegistrationBean

    Regardez la définition de Filter, vous pouvez voir que c'est la même chose que le contenu de l'annotation du filtre Web

    public class ServletRegistrationBean<T extends Servlet> extends DynamicRegistrationBean<ServletRegistration.Dynamic> {
        private static final String[] DEFAULT_MAPPINGS = new String[]{"/*"};
        private T servlet;
        private Set<String> urlMappings;
        private boolean alwaysMapUrl;
        private int loadOnStartup;
        private MultipartConfigElement multipartConfig;
        ......
        }

    Utilisez généralement sa sous-classe FilterRegistrationBean en développement , et utilisez 2.1 ci-dessus pour vous inscrire manuellement.

    Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

    Déclaration:
    Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer