ITPub博客

首页 > 数据库 > 数据库开发技术 > Spring Boot:非常实用的内置功能

Spring Boot:非常实用的内置功能

原创 数据库开发技术 作者:IT枫斗者 时间:2024-11-08 17:44:15 0 删除 编辑

在Spring Boot开发中,我们经常会遇到一些通用需求,比如请求数据记录、请求/响应包装、过滤器管理等。幸运的是,Spring Boot内置了许多功能,能帮助开发者高效地完成这些任务。今天,我们将介绍一些Spring Boot框架中非常实用的内置功能。



一、请求数据记录





Spring Boot提供了一个强大的内置日志记录解决方案,可以帮助我们记录每一个HTTP请求的详细信息。通过AbstractRequestLoggingFilter,可以轻松记录请求的参数、请求体、请求头和客户端信息,帮助开发者在调试或日志分析时,追踪请求的详细信息。


最常用的实现类是CommonsRequestLoggingFilter,以下是如何配置请求记录功能:

@Configurationpublic class RequestLoggingConfig {    @Bean    public CommonsRequestLoggingFilter logFilter() {        CommonsRequestLoggingFilter filter = new CommonsRequestLoggingFilter();        filter.setIncludeQueryString(true);        filter.setIncludePayload(true);        filter.setIncludeHeaders(true);        filter.setIncludeClientInfo(true);        filter.setAfterMessagePrefix("REQUEST DATA-");        return filter;    }}


启用日志记录后,我们还需要将日志级别设置为DEBUG,如下所示:

logging.level.org.springframework.web.filter.CommonsRequestLoggingFilter=DEBUG


通过这种方式,开发者可以轻松记录每一个请求的数据,包括请求参数、请求体、请求头等,为开发调试提供便利。




二、请求与响应包装器





在Spring Boot中,HttpServletRequest和HttpServletResponse对象可以通过包装器来增强其功能。通过请求和响应包装器,开发者可以拦截、修改请求和响应数据,进而实现一些高级功能,例如请求内容的缓存、日志记录、响应内容的修改等。



请求包装器

ContentCachingRequestWrapper是一个请求包装器,用于缓存请求的输入流。它允许我们多次读取请求体,特别适用于需要多次处理请求数据(如日志记录和业务处理)的场景。


响应包装器

ContentCachingResponseWrapper是响应包装器,用于缓存响应的输出流。开发者可以在响应返回给客户端之前修改响应体,例如添加额外的头部信息或修改响应内容。


使用场景:

请求日志记录:记录请求头、请求参数及请求体。
修改请求数据:在请求到达控制器之前,修改请求数据。
响应内容修改:修改响应体或头部信息,添加签名等。
性能测试:通过缓存请求和响应数据,进行性能测试,而不影响网络I/O。


请求包装器的使用:

@Componentpublic class RequestWrapperFilter extends OncePerRequestFilter {    @Override    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)            throws ServletException, IOException {        ContentCachingRequestWrapper requestWrapper = new ContentCachingRequestWrapper(request);        byte[] body = requestWrapper.getContentAsByteArray();        // 处理请求数据,例如记录日志        filterChain.doFilter(requestWrapper, response);    }}


响应包装器的使用:

@Componentpublic class ResponseWrapperFilter extends OncePerRequestFilter {    @Override    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)            throws ServletException, IOException {        ContentCachingResponseWrapper responseWrapper = new ContentCachingResponseWrapper(response);        filterChain.doFilter(request, responseWrapper);
byte[] body = responseWrapper.getContentAsByteArray(); // 修改响应数据,例如添加签名 responseWrapper.setHeader("X-Signature", "some-signature"); // 必须调用此方法将修改后的响应数据返回给客户端 responseWrapper.copyBodyToResponse(); }}


通过这种方式,开发者可以灵活地操作请求和响应数据,满足不同的需求。




三、单次过滤器 

OncePerRequestFilter





OncePerRequestFilter是Spring框架提供的一个过滤器基类,它确保每个请求在其生命周期内只执行一次过滤逻辑。即使请求被转发或包含,过滤器的执行逻辑也只会执行一次,避免了重复处理的开销。


特点:

单次执行:即使请求被转发或包含,过滤器逻辑只执行一次。
内置支持:支持请求和响应包装器,方便开发者处理请求和响应数据。
易于扩展:通过重写doFilterInternal方法,可以实现自定义的过滤逻辑。



    使用场景:

    请求日志记录:在请求处理之前和之后记录请求的详细信息。
    数据修改:在请求到达控制器之前,修改请求数据。
    响应数据修改:在响应返回之前,修改响应数据。
    安全控制:进行身份验证、授权等操作。


    OncePerRequestFilter非常适合用于处理需要在请求生命周期内只执行一次的逻辑,确保代码简洁且高效。




    四、AOP三件套





    在Spring框架中,AOP(面向切面编程)是一个强大的工具,能够在不修改源代码的情况下,横向切入程序的特定部分。Spring提供了几个实用类,如AopContext、AopUtils和ReflectionUtils,它们能帮助开发者高效地进行AOP相关操作。


    AopContext

    AopContext用于获取当前AOP代理对象,避免同一个类中的事务注解失效。通过AopContext.currentProxy()可以获取当前代理对象,确保事务或切面逻辑能够正确应用。


    AopUtils

    AopUtils提供了一些工具方法,用于处理AOP相关的操作,例如判断代理类型、获取代理对象等。


    ReflectionUtils

    ReflectionUtils提供了一些便捷的反射方法,帮助开发者更加简洁地进行反射操作,如设置字段值、获取字段值、调用方法等。


    通过使用这些工具类,开发者可以更加方便地操作Spring中的AOP切面,简化代码,提升开发效率。



    这些Spring Boot内置功能让开发者能够更轻松地处理请求、响应以及AOP相关的任务,从而提高了开发效率,并确保代码的高可维护性。在实际开发中,合理使用这些功能,能够大大简化代码结构,使得开发过程更加顺畅。


    如果你有任何疑问,或者想要了解更多Spring Boot的其他功能,欢迎在评论区留言!


    👋 大家好,我是枫哥,一名Java后端开发者!我热衷于探索新技术,并在我的微信公众号上分享关于Java 生态和后端开发的知识。欢迎关注我的公众号,期待与你一起探讨技术的无穷可能!” 目前专注于Java技术分享,覆盖春招、秋招、社招和跳槽相关内容,并提供一对一带徒学习服务。加入 学徒计划,即可享受内推机会和优质资源,签订协议确保就业无忧。此外,我们还推出了‘Java跳槽网’, 为你的求职之路提供全方位支持,助你快速找到理想工作

    原文作者:IT枫斗者;如有侵权,请联系管理员删除。

    请登录后发表评论 登录
    全部评论
    大家好,我是枫哥,🌟阿里云技术专家、📝资深面试官、🌹Java跳蚤网课堂创始人。技术交流vx:itfdz666,拥有多年一线研发经验,曾就职过科大讯飞、美团网、平安等公司。看面试实战视频可以关注b站号:IT枫斗者–Java面试。需要看技术文章,可以关注CSDN:IT枫斗者。

    注册时间:2020-05-13

    • 博文量
      183
    • 访问量
      81343