项目中有时需要和外部系统对接,为了便于排查接口传参是否正确,可以新增一个拦截器打印访问日志。
可以通过继承Filter接口,重写doFilter方法实现。将请求在进入Controller层前拦截下来,并打印出请求的方法、参数以及请求方IP。
package com.tct.ii.ucr.core.filter;
import com.tct.ii.ucr.common.BodyReaderHttpServletRequestWrapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.tomcat.util.http.fileupload.servlet.ServletFileUpload;
import org.springframework.util.StringUtils;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.Arrays;
import java.util.Map;
/**
* 默认的access filter
* 主要用于调试时打印访问日志
* 可由配置文件的配置控制在filter registry生成注册
* @author wl
* @date 2021/7/26
*/
@Slf4j
public class DefaultAccessFilter implements Filter {
private static final String UNKNOWN = "unknown";
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
ServletRequest requestWrapper = null;
try {
HttpServletRequest request = (HttpServletRequest) servletRequest;
String requestMethod = request.getMethod();
log.info("请求方式:" + requestMethod + " 请求地址: " + request.getRequestURI() + "; 请求来源:" + getRealIp(request));
if ("POST".equals(requestMethod)) {
if (ServletFileUpload.isMultipartContent(request)) {
log.info("请求包含文件");
}else {
requestWrapper =