最近接触到filter过滤器,之前都没有接触到,这次在组长大人得帮助下对filter过滤器有了一点概念,组长大人还给了一个例子,记录一下。
@Configuration public class SpringMvcConfig implements WebMvcConfigurer { @Bean public FilterRegistrationBean filterRegist() { FilterRegistrationBean frBean = new FilterRegistrationBean(); //定义一个 ParamterFilter过滤器 frBean.setFilter(new ParamterFilter()); //需要拦截的地址 frBean.addUrlPatterns("/cxf/*"); //设置注册名称,若没有指定,使用bean名称 frBean.setName("WebAsscessFilterMVC"); return frBean; } } @Component public class ParamterFilter extends OncePerRequestFilter { @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { if(HttpMethod.POST.equals(HttpMethod.resolve(request.getMethod()))){ //调用封装好的一个Wrapper PostRequestWrapper postRequestWrapper = new PostRequestWrapper(request); wirteLog(postRequestWrapper,response); filterChain.doFilter(postRequestWrapper,response); }else { wirteLog(request,response); filterChain.doFilter(request,response); } } protected void wirteLog(HttpServletRequest request, HttpServletResponse response) throws IOException { InputStream inputStream = request.getInputStream(); ByteArrayOutputStream result = new ByteArrayOutputStream(); byte[] buf = new byte[2048]; int len = 0; while((len=inputStream.read(buf))>0){ result.write(buf,0,len); } logger.debug(result.toString()); } } public class PostRequestWrapper extends HttpServletRequestWrapper { private Logger logger = LoggerFactory.getLogger(PostRequestWrapper.class); private final byte[] bodyData; /** * Constructs a request object wrapping the given request. * * @param request The request to wrap * @throws IllegalArgumentException if the request is null */ public PostRequestWrapper(HttpServletRequest request) { super(request); bodyData = getByteFromRequest(request); } /** * 获取Body中的字符中表示 * @return */ public String getBodyString() { if(bodyData != null && bodyData.length>0){ return new String(bodyData); } return null; } /** *从Body体中获取数据并保存 * @param request * @return */ protected byte[] getByteFromRequest(HttpServletRequest request){ ByteArrayOutputStream result = new ByteArrayOutputStream(); try { //BufferedReader reader = new BufferedReader(new InputStreamReader(request.getInputStream())); byte[] buf = new byte[2048]; int len = 0; while ((len=request.getInputStream().read(buf))>0){ result.write(buf,0,len); } } catch (IOException e) { logger.error("{}",e); } return result.toByteArray(); } @Override public BufferedReader getReader() throws IOException { return new BufferedReader(new InputStreamReader(getInputStream())); } @Override public ServletInputStream getInputStream() throws IOException { final ByteArrayInputStream inputStream = new ByteArrayInputStream(bodyData); return new ServletInputStream() { @Override public int read() throws IOException { return inputStream.read(); } @Override public boolean isFinished() { return false; } @Override public boolean isReady() { return false; } @Override public void setReadListener(ReadListener readListener) { } }; } }这样就ok啦,就能在日志中查看到拦截信息。 知识嘛,慢慢积累,就好啦。