第一步 继承HttpServletRequestWrapper

package com.xxx.common.filter;

import lombok.extern.slf4j.Slf4j;

import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.*;
import java.nio.charset.StandardCharsets;

/**
 * 继承 HttpServletRequestWrapper 
 */
@Slf4j
public class CopyHttpServletRequestWrapper extends HttpServletRequestWrapper {

    private final String requestBody;

    public CopyHttpServletRequestWrapper(HttpServletRequest request) {
        super(request);
        requestBody = readRequestBody(request);
    }

    @Override
    public ServletInputStream getInputStream() throws IOException {
        final byte[] bytes = requestBody.getBytes(StandardCharsets.UTF_8);
        return new ServletInputStream() {
            private int currentIndex = 0;

            @Override
            public int read() throws IOException {
                if (currentIndex >= bytes.length) {
                    return -1;
                }
                return bytes[currentIndex++];
            }

            @Override
            public boolean isFinished() {
                return currentIndex >= bytes.length;
            }

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

            @Override
            public void setReadListener(ReadListener readListener) {
                throw new UnsupportedOperationException();
            }
        };
    }

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

    private String readRequestBody(HttpServletRequest request) {
        StringBuilder stringBuilder = new StringBuilder();
        try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(request.getInputStream(), StandardCharsets.UTF_8))) {
            String line;
            while ((line = bufferedReader.readLine()) != null) {
                stringBuilder.append(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return stringBuilder.toString();
    }
}

第二步 实现Filter方法

package com.xxx.common.filter;

import org.springframework.stereotype.Component;

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

/**
 * 实现 Filter方法
 */
@Component
public class CopyFilter implements Filter {

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        if (servletRequest instanceof HttpServletRequest) {
            HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
            final CopyHttpServletRequestWrapper copyHttpServletRequestWrapper = new CopyHttpServletRequestWrapper(httpServletRequest);
            filterChain.doFilter(copyHttpServletRequestWrapper, servletResponse);
        } else {
            filterChain.doFilter(servletRequest, servletResponse);
        }
    }
}

第三步 放入配置类

package com.xxx.framework.config;

import java.util.HashMap;
import java.util.Map;
import javax.servlet.DispatcherType;

import com.xxx.common.filter.CopyFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;

/**
 * Filter 配置
 */
@Configuration
public class FilterConfig
{
    @Bean
    @Order(1)
    public FilterRegistrationBean<CopyFilter> copyFilters() {
        final FilterRegistrationBean<CopyFilter> registrationBean = new FilterRegistrationBean<>();
        registrationBean.setFilter(new CopyFilter());
        registrationBean.addUrlPatterns("/*");
        return registrationBean;
    }
}

第四步 实现HandlerInterceptor 拦截器处理

package com.xxx.interceptor.interceptorAdapter;

import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import java.io.*;
import java.nio.charset.StandardCharsets;

/**
 * 初始化验证拦截
 */
@Component
public class InitInterceptor implements HandlerInterceptor {


    private Logger logger = LoggerFactory.getLogger(InitInterceptor.class);

    /**
     * 请求进去controller进行请求拦截
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {

        String requestUrl = request.getRequestURL().toString();
        String method = request.getMethod();
        String requestUri = request.getRequestURI();
        String queryString = request.getQueryString();

        logger.info("当前请求完整地址 - {}", requestUrl);
        logger.info("当前请求接口地址 - {}", requestUri);
        logger.info("当前请求接口方法 - {}", method);
        logger.info("当前请求接口地址上传GET参数 - {} ", queryString);
        logger.info("当前请求接口地址上传POST参数 - {}", getBodyString(request));

        return true;
    }

    /**
     * 请求进入controller后调用
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

    }

    /**
     * 请求得到响应的时候调用
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

    }

    /**
     * 获取请求Body
     */
    public static String getBodyString(final ServletRequest request) {
        StringBuilder sb = new StringBuilder();
        InputStream inputStream = null;
        BufferedReader reader = null;
        try {
            inputStream = request.getInputStream();
            reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8));
            String line = "";
            while ((line = reader.readLine()) != null) {
                sb.append(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return sb.toString();
    }
}
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐