Maison >Java >javaDidacticiel >Analyse comparative d'exemples chronophages d'implémentation SpringBoot d'intercepteurs de filtres

Analyse comparative d'exemples chronophages d'implémentation SpringBoot d'intercepteurs de filtres

WBOY
WBOYavant
2023-05-12 09:43:131735parcourir

Méthode Filter

Cette méthode est plus simple mais pas très configurable

Remarque : Doit être numérisée dans le conteneur Spring

Créez une classe pour implémenter l'interface de filtre

  • init : Cette méthode est destinée au filtre L'initialisation de l'objet La méthode n'est appelée qu'une seule fois après que le conteneur a initialisé l'objet filtre.Le paramètre FilterConfig peut obtenir les paramètres d'initialisation du filtre

  • doFilter : peut effectuer une requête et une réponse <u>预处理</u>其中FilterChain可以将处理后的Les objets de requête et de réponse sont transmis à la chaîne de filtrage ; ressource.

  • destroy() : Cette méthode est appelée avant que le conteneur ne détruise l'objet.

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

@Component
public class LogFilter implements Filter {

    private static final Logger LOG = LoggerFactory.getLogger(LogFilter.class);

    @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;
        LOG.info("------------- LogFilter 开始 -------------");
        LOG.info("请求地址: {} {}", request.getRequestURL().toString(), request.getMethod());
        LOG.info("远程地址: {}", request.getRemoteAddr());

        long startTime = System.currentTimeMillis();
        filterChain.doFilter(servletRequest, servletResponse);
        LOG.info("------------- LogFilter 结束 耗时:{} ms -------------", System.currentTimeMillis() - startTime);
    }
}

Résultats

Analyse comparative dexemples chronophages dimplémentation SpringBoot dintercepteurs de filtres

Résumé

1. Les filtres sont utilisés pour implémenter des fonctions communes, réduire la redondance du code et améliorer la maintenabilité

2.

3. Une ressource peut également être configurée avec plusieurs filtres, qui sont appelés dans l'ordre de configuration.

Comment intercepter

Si vous ne comprenez pas, veuillez d'abord lire l'introduction puis revenir

Introduction à l'intercepteur

Plus de mots, allez simplement au code

Créer un intercepteur

/**
 * 拦截器:Spring框架特有的,常用于登录校验,权限校验,请求日志打印 /login
 * @author : look-word
 * 2022-06-26 13:55
 **/
@Component
public class LogInterceptor implements HandlerInterceptor {
    private static final Logger LOG = LoggerFactory.getLogger(LogInterceptor.class);

        
    @Override
     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
         // 打印请求信息
         LOG.info("------------- LogInterceptor 开始 -------------");
         LOG.info("请求地址: {} {}", request.getRequestURL().toString(), request.getMethod());
         LOG.info("远程地址: {}", request.getRemoteAddr());

         long startTime = System.currentTimeMillis();
         request.setAttribute("requestStartTime", startTime);
         return true;
     }

     @Override
     public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
         long startTime = (Long) request.getAttribute("requestStartTime");
         LOG.info("------------- LogInterceptor 结束 耗时:{} ms -------------", System.currentTimeMillis() - startTime);
     }
}

Enregistrez un intercepteur

Notre intercepteur est enregistré dans la chaîne des intercepteurs

/**
 * @author : look-word
 * 2022-06-26 14:03
 **/
@Configuration
public class SpringMvcConfig implements WebMvcConfigurer {

    @Resource
    private LogInterceptor logInterceptor;
    /**
     * 注册拦截器
     * @param registry
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry
                .addInterceptor(logInterceptor)
                .addPathPatterns("/**")// 对那些接口拦截
                .excludePathPatterns("/login");// 对哪些接机口放行
        WebMvcConfigurer.super.addInterceptors(registry);
    }
}

Résultats des tests

Analyse comparative dexemples chronophages dimplémentation SpringBoot dintercepteurs de filtres

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