filter 攔截器 獲取http請求參數


里面一些方法使用了hutool的工具類 可以替換成你自己習慣的 工具類不是記錄的主要東西。

記錄點
1.怎么創建攔截器
2.怎么統一管理攔截器是否啟用和輸用順序
3.怎么獲取傳入的參數
4.怎么獲取返回值

直接上代碼===================================================

filter配置

@Configuration 	
public class FilterConfig { 	  //log攔截器啟動
    @Bean
    public FilterRegistrationBean logFilterRegistration() {
        FilterRegistrationBean registration = new FilterRegistrationBean();
        registration.setDispatcherTypes(DispatcherType.REQUEST);
        registration.setFilter(new LogFilter());
        registration.addUrlPatterns("/*");
        registration.setName("logFilter");
        registration.setOrder(Integer.MAX_VALUE-1);
        return registration;
    } 	}

LogFilter

/**
 * log過濾
 *
 * @author Teler
 */
public class LogFilter implements Filter {


    @Override
    public void init(FilterConfig config) throws ServletException {
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain)
            throws IOException, ServletException {

        //為了在post的時候能繼續傳遞
        LogHttpServletRequestWrapper request = new LogHttpServletRequestWrapper((HttpServletRequest) servletRequest);
        MyResponseWrapper response = new MyResponseWrapper((HttpServletResponse) servletResponse);

        StaticLog.info("=====================LogFilter前置start=====================>");

        //封裝log實體類
         Map<String, Object> parameterMap=new LinkedHashMap<>();
        if("GET".equals(request.getMethod())){
            parameterMap= JSONUtil.parseObj(ServletUtil.getParams(request));
        }else{
            parameterMap= JSONUtil.parseObj(request.getBody());
        }
        StaticLog.info("請求來源: =》{}", request.getRemoteAddr());
        StaticLog.info("請求URI:{}", request.getRequestURI());
        StaticLog.info("請求方式:{}", request.getMethod());
        StaticLog.info("請求參數:{}", parameterMap);
        StaticLog.info("=====================LogFilter前置  end=====================>");
        //消耗時間
        long start = System.currentTimeMillis();

        // 執行主體方法start==================================================================
        chain.doFilter(request, response);
        // 執行主體方法  end==================================================================

        //耗時
        long time = System.currentTimeMillis() - start;
        StaticLog.info("=====================LogFilter后置start=====================>");
        byte[] content=response.getContent();
        String resultParams=new String();
        if (content.length > 0) {
            resultParams= new String(content, "UTF-8");
        }
             StaticLog.info("返回值:{}", resultParams);
        StaticLog.info("耗時(毫秒):", time);
        //返回消息 否則前台收不到消息
        servletResponse.getOutputStream().write(resultParams.getBytes());
        StaticLog.info("=====================LogFilter后置  end=====================>");
    }

    @Override
    public void destroy() {
    }
}

LogHttpServletRequestWrapper.java

public class LogHttpServletRequestWrapper extends HttpServletRequestWrapper {
    private final String body;

    public LogHttpServletRequestWrapper(HttpServletRequest request) {
        super(request);
        StringBuilder stringBuilder = new StringBuilder();
        BufferedReader bufferedReader = null;
        InputStream inputStream = null;
        try {
            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) {

        } finally {
            if (inputStream != null) {
                try {
                    inputStream.close();
                }
                catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (bufferedReader != null) {
                try {
                    bufferedReader.close();
                }
                catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        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 readListener) {
            }
            @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;
    }

}

MyResponseWrapper.java

public class MyResponseWrapper extends HttpServletResponseWrapper {
    private ByteArrayOutputStream buffer;

    private ServletOutputStream out;

    public MyResponseWrapper(HttpServletResponse httpServletResponse) {
        super(httpServletResponse);
        buffer = new ByteArrayOutputStream();
        out = new WrapperOutputStream(buffer);
    }

    @Override
    public ServletOutputStream getOutputStream() throws IOException {
        return out;
    }

    @Override
    public void flushBuffer()
            throws IOException {
        if (out != null) {
            out.flush();
        }
    }

    public byte[] getContent() throws IOException {
        flushBuffer();
        return buffer.toByteArray();
    }

    class WrapperOutputStream extends ServletOutputStream {
        private ByteArrayOutputStream bos;

        public WrapperOutputStream(ByteArrayOutputStream bos) {
            this.bos = bos;
        }

        @Override
        public void write(int b)
                throws IOException {
            bos.write(b);
        }

        @Override
        public boolean isReady() {

            // TODO Auto-generated method stub
            return false;

        }

        @Override
        public void setWriteListener(WriteListener arg0) {

            // TODO Auto-generated method stub

        }
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM