J'utilise Spring MVC ** Je veux enregistrer l'URL de la requête et les paramètres de la requête! ** ** Cela arrivait souvent, et à chaque fois que je créais une classe de filtre dédiée,
Ne serait-il pas heureux si je le laissais dans l'article pour moi-même?
Je l'ai pensé et décrit. C'est une note tout à fait personnelle.
Java 8 (fonctionne également avec 11)
Spring Boot 2.2.1
Spring MVC (la version utilise les règles de démarrage)
Lombok (la version utilise les règles de démarrage)
Je ne l'ai pas essayé avec Spring Web Flux.
package com.example.demo.filter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Arrays;
import java.util.Map;
@Slf4j
@Component
public class LoggingFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpReq = ((HttpServletRequest)request);
        String uri = httpReq.getRequestURI();
        long start = System.currentTimeMillis();
        log.info(String.format("Commencer le traitement. URI: %s", uri));
        //Traitez le paramètre de demande et sortez-le sous forme de journal sur une ligne
        Map<String, String[]> params = httpReq.getParameterMap();
        StringBuilder strParams = new StringBuilder("Paramètres de demande: [");
        boolean isFirstParam = true;
        for (Map.Entry<String, String[]> param : params.entrySet()) {
            if (isFirstParam) {
                isFirstParam = false;
            } else {
                //Ajouter une virgule comme concaténateur pour le deuxième paramètre de requête et les suivants
                strParams.append(", ");
            }
            strParams.append(param.getKey()).append("=").append(Arrays.toString(param.getValue()));
        }
        strParams.append("]");
        log.info(strParams.toString());
        //Mise en œuvre de chaque processus
        chain.doFilter(request, response);
        int status = ((HttpServletResponse) response).getStatus();
        log.info(String.format("Sortie de traitement.Temps requis%d millis. STATUS=%d", System.currentTimeMillis() - start, status));
    }
    @Override
    public void destroy() {
    }
}
2019-11-14 11:54:40.297  INFO 2001 --- [nio-8080-exec-1] com.example.demo.filter.LoggingFilter    :Commencer le traitement. URI: /demo/hello
2019-11-14 11:54:40.298  INFO 2001 --- [nio-8080-exec-1] com.example.demo.filter.LoggingFilter    :Paramètres de demande: [hoge=[1], fuga=[2]]
2019-11-14 11:54:40.327  INFO 2001 --- [nio-8080-exec-1] com.example.demo.filter.LoggingFilter    :Sortie de traitement.Temps requis 30 millis. STATUS=200
Le format du journal reste la norme Spring Boot. Personnellement, la sortie du journal est écrite en japonais car elle est facile à comprendre en japonais. Parfois, je pense qu'il vaut mieux faire un peu plus, mais je l'écris souvent dans ce style. Il n'est pas surprenant que la déclaration For étendue soit un peu dégoûtante, mais elle est ennuyeuse et n'a pas été révisée.
Notez que ce filtre prend en charge les paramètres de tableau, mais ne prend pas en charge les fichiers joints.
Recommended Posts