拦截器打印日志(get/post等)

兼容get和post方式

Post如果是以json形式存放,只能通过输入流读取,但是输入流只能读取一次,所以需要定义新的过滤器,将输入流缓存下来,方便多次读取

1.实现HttpServletRequestWrapper接口

import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.*;
public class BodyReaderHttpServletRequestWrapper extends HttpServletRequestWrapper {
    private final String body;

    public BodyReaderHttpServletRequestWrapper(HttpServletRequest request) throws IOException {
        super(request);
        StringBuilder stringBuilder = new StringBuilder();
        BufferedReader bufferedReader = null;
        try {
            InputStream inputStream = request.getInputStream();
            if (inputStream != null) {
                bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
                char[] charBuffer = new char[128];
                int bytesRead = -1;
                while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
                    stringBuilder.append(charBuffer, 0, bytesRead);
                }
            } else {
                stringBuilder.append("");
            }
        } catch (IOException ex) {
            throw ex;
        } finally {
            if (bufferedReader != null) {
                try {
                    bufferedReader.close();
                } catch (IOException ex) {
                    throw ex;
                }
            }
        }
        body = stringBuilder.toString();
    }

    @Override
    public ServletInputStream getInputStream() throws IOException {
        final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body.getBytes());

        ServletInputStream servletInputStream = new ServletInputStream() {
            @Override
            public boolean isFinished() {
                return false;
            }

            @Override
            public boolean isReady() {
                return false;
            }

            @Override
            public void setReadListener(ReadListener listener) {

            }

            @Override
            public int read() throws IOException {
                return byteArrayInputStream.read();
            }
        };
        return servletInputStream;

    }

    @Override
    public BufferedReader getReader() throws IOException {
        return new BufferedReader(new InputStreamReader(this.getInputStream()));
    }

    public String getBody() {
        return this.body;
    }
}

2.过滤器


import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

/**
 * @Author : YingZhang
 * @Description:
 * @Date : Create in 3:29 PM 6/27/2018
 */
@WebFilter( urlPatterns = "/*")
public class HttpServletRequestWrapperFilter implements Filter {

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

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        ServletRequest requestWrapper = null;
        if (request instanceof HttpServletRequest) {
            requestWrapper = new BodyReaderHttpServletRequestWrapper((HttpServletRequest) request);
        }
        if (null == requestWrapper) {
            chain.doFilter(request, response);
        } else {
            chain.doFilter(requestWrapper, response);
        }
    }

    @Override
    public void destroy() {

    }
}

3 拦截器 拦截所有controller


import com.alibaba.fastjson.JSON;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.InputStreamReader;

/**
 * @Author : YingZhang
 * @Description:
 * @Date : Create in 4:57 PM 6/25/2018
 */
public class LoggerInterceptor implements HandlerInterceptor {
    private static final Logger LOGGER = LoggerFactory.getLogger(LoggerInterceptor.class);


    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        try {
            StringBuilder sb = new StringBuilder(1000);
            String method = request.getMethod();
            sb.append("请求内容:\n");
            if("GET".equals(method)){
                sb.append("reqParams : " + JSON.toJSONString(request.getParameterMap()) +"\n");
            }else{
                StringBuilder responseStrBuilder = new StringBuilder ();
                BufferedReader streamReader = new BufferedReader (new InputStreamReader(request.getInputStream (),"UTF-8"));
                String inputStr;
                while ((inputStr = streamReader.readLine ()) != null)
                    responseStrBuilder.append (inputStr);
                sb.append("reqParams : "+ responseStrBuilder.toString()+"\n");
            }
            if (handler instanceof HandlerMethod) {
                HandlerMethod h = (HandlerMethod) handler;
                sb.append("ReqMethod : ").append(method).append("\n");
                sb.append("Controller: ").append(h.getBean().getClass().getName()).append("\n");
                sb.append("Method    : ").append(h.getMethod().getName()).append("\n");
            }
            LOGGER.info(sb.toString());
        } catch (Exception e) {
            LOGGER.error("记录日志失败" + e.getMessage());
        }
        return true;
    }

}

4.添加拦截器

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
  
   @Bean
    LoggerInterceptor getLogger() {
        return new LoggerInterceptor();
    }
    @Override
    public void addInterceptors(InterceptorRegistry registry) {

        registry.addInterceptor(getLogger())
                .addPathPatterns("/**")
                .excludePathPatterns("/login")
  
    }


}

猜你喜欢

转载自blog.csdn.net/qq_35720307/article/details/80833046