不喜欢使用AOP打印日志的方式,我个人认为它破坏了封装,所以我准备自己定义一个过滤器,专门用来打印日志,本示例是集成了spring mvc的,所以如果不使用spring mvc的话就没必要参考了

1.创建类RequestWrapper 继承 HttpServletRequestWrapper,然后重写
getInputStream()和getReader()两个方法

public class RepeatableServletRequest extends HttpServletRequestWrapper {private boolean isUpload;private byte[] body;private Collection<Part> parts;public RepeatableServletRequest(HttpServletRequest request) throws IOException {super(request);StandardServletMultipartResolver resolver = new StandardServletMultipartResolver();if (resolver.isMultipart(request)) {isUpload = true;try {parts = request.getParts();} catch (ServletException e) {e.printStackTrace();}} else {InputStream input = request.getInputStream();body = input.readAllBytes();}}@Overridepublic ServletInputStream getInputStream() throws IOException {ByteArrayInputStream arr = new ByteArrayInputStream(body);return new RepeatableServletInputStream(arr);}@Overridepublic BufferedReader getReader() throws IOException {Reader in = new InputStreamReader(getInputStream());return new BufferedReader(in);}@Overridepublic Collection<Part> getParts() {return parts;}/*** 当前请求是否是上传文件的功能** @return true表示是上传文件*/public boolean isUpload() {return isUpload;}
}

接下来使用上述Wrapper类,分两种

1.如果项目不是spring boot项目(老式的xml配置),则创建类RequestFilter类,实现 Filter

@Order(0)
//注意这里,无需再从web.xml中配置了
@WebFilter(filterName = "MyFilter", urlPatterns = "/*")
public class MyFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain){{HttpServletRequest httpReq = (HttpServletRequest) request;RepeatableServletRequest newRequest = new RepeatableServletRequest(httpReq);// 打印HttpMethod和URLStringBuilder sb = new StringBuilder();sb.append(httpReq.getMethod());sb.append(" ");sb.append(httpReq.getRequestURL());if (httpReq.getQueryString() != null) {sb.append("?");sb.append(httpReq.getQueryString());}LOGGER.info(sb.toString());// 打印部分请求头LOGGER.info("Content-Type:{}", request.getContentType());// 打印请求体if (newRequest.isUpload()) {Collection<Part> collection = newRequest.getParts();Iterator<Part> iterator = collection.iterator();LOGGER.info("上传{}个文件", collection.size());while (iterator.hasNext()) {Part part = iterator.next();LOGGER.info("请求字段名:[{}],文件名[{}],大小[{}]字节", part.getName(), part.getSubmittedFileName(), part.getSize());}} else {InputStream body = newRequest.getInputStream();byte[] bytes = body.readAllBytes();if (bytes.length != 0) {String bodyStr = new String(bytes);LOGGER.info(bodyStr.replace("\r\n", ""));}}chain.doFilter(newRequest, response);}}@Overridepublic void destroy() {}}

2.如果项目是spring boot,那么需要扫描到WebFilter注解,需要在启动类添加

@SpringBootApplication
//扫描servlet相关注解
@ServletComponentScan
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
}

笔记:目前最新版的spring boot使用下面写法也可以,可以代替@WebFilter注解

@Configuration
public class MyFilter implements Filter

Servlet-HttpServletRequestWrapper相关推荐

  1. HttpServletRequestWrapper的使用

    老大给了一个很实际的需求:有段程序,使用Http的方式与合作商交互,而且是明文传输数据.我方的代码已经打包放在服务器上运行了很长时间,这时合作商突然要求修改数据传输的方式,要求加密后再传输,而我方的原 ...

  2. Servlet之Filter过滤器

    过滤器是一个实现了javax.servlet.Filter 接口的 Java 类.javax.servlet.Filter 接口定义了三个方法: 1    public void doFilter ( ...

  3. uestWrapper.getSession(HttpServletRequestWrapper.java:241) ~[tomcat-embed-core-9.0.13.jar:9.0.13]

    报错信息如下: uestWrapper.getSession(HttpServletRequestWrapper.java:241) ~[tomcat-embed-core-9.0.13.jar:9. ...

  4. Servlet 过滤器

    一.Filter 概述 Filter 也称之为过滤器,它是Servlet 技术中很实用的一个知识点,Web 开发人员通过Filter 技术,对Web 服务器管理的所有Web 资源:例如Jsp, Ser ...

  5. 装饰者模式源码解析(spring-session mybatis jdk servlet)

    那在JDK中体现最明显的,就是JAVA IO方面的一些类,那在JAVA IO中,我们为了增加缓存,我们使用BufferedReader,那现在我们来看一下,那因为增加缓存的功能,类有很多,子类也就需要 ...

  6. servlet面试常问问题_50个Servlet面试问答

    servlet面试常问问题 Servlet是Java EE的一个非常重要的主题,所有Web应用程序框架(例如Spring和Struts)都建立在它之上. 这使servlet成为Java访谈中的热门话题 ...

  7. 50个Servlet面试问答

    Servlet是Java EE的一个非常重要的主题,所有Web应用程序框架(例如Spring和Struts)都建立在它之上. 这使servlet成为Java访谈中的热门话题. 在这里,我提供了50个s ...

  8. HttpServletRequestWrapper使用技巧(自定义session和缓存InputStream)

    一.前言 javax.servlet.http.HttpServletRequestWrapper 是一个开发者可以继承的类,我们可以重写相应的方法来实现session的自定义以及缓存InputStr ...

  9. Servlet - Listener、Filter、Decorator

    Servlet 标签 : Java与Web Listener-监听器 Listener为在Java Web中进行事件驱动编程提供了一整套事件类和监听器接口.Listener监听的事件源分为Servle ...

  10. Filter in Servlet

    一.什么是Filter 过滤器(Filter)是可以转换请求或响应的标题和内容(或两者)的对象.过滤器不同于Web组件,因为过滤器本身通常不会创建响应.相反,过滤器提供的功能可以"附加&qu ...

最新文章

  1. Arithmetic
  2. 如何释放电脑被限制的20%网速?
  3. SAP PM 初级系列15 - IW33事务代码界面里查看维修工单对应的维修通知单的几个方法
  4. 哈希表(等概率下)平均查找长度(转)
  5. TCP/IP模型层次结构
  6. P4981-父子【数学,树】
  7. Oracle 19.8新特性asmcmd credverify and asmcmd credfix
  8. 将三个数按从大到小输出
  9. Nginx+Tomcat搭建高性能负载均衡集群
  10. react 遍历渲染
  11. 【语音去噪】基于matlab小波软阈值语音降噪【含Matlab源码 531期】
  12. VM14安装CentOS7并配置网络
  13. matlab科研绘图模板,直接奉上源代码!
  14. php怎么处理背景虚化,图片虚化处理 照片制作成视频|图片背景虚化后制作成视频并添加音乐...
  15. post测试+php文件,PHPT – 无法运行使用–POST_RAW–的示例测试
  16. html5游戏ztype源码,Ztype打字游戏!
  17. 使用html5 canvas绘制简单图形小作品~灰太狼
  18. 微控制器编程技术c语言,1.单片机C语言编程技术分析.pptx
  19. [js项目]封装库-连缀
  20. 统计学简介之十——样本量的确定

热门文章

  1. 【老军医方】在脱发过程中遇到的各种疑难杂症
  2. 揪出造成失败用户登录的应用主机名、数据库用户信息
  3. html页面判断其他div为空,将外部html加载到div - 页面加载然后变为空白
  4. 订阅号如何配置服务器信息,订阅号服务号区别和订阅号启动服务器配置
  5. d. powerful ksenia_DEBON D.D |这才是每个女人应该拥有的
  6. Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.9
  7. java 保留字符串数字的位数,不够前面补0
  8. Vue中mounted和created的区别
  9. keep-alive + vuex + mint + Infinite scroll 保存分页列表数据
  10. Disruptor 分析