不用aop,获取 request 对象中所有形式的参数,包含 get参数,post body参数,restful格式的所有参数。put all parameters into 1 single map

Spring Boot中优雅获取所有请求参数:Filter+Interceptor实现
本文介绍了如何在Spring Boot应用中,不使用AOP而是通过Filter和Interceptor来优雅地获取所有请求参数。作者指出AOP的动态代理机制在效率上存在不足,并给出了一种原始编程的解决方案。通过创建一个`WrapRequestFilter`来封装request对象,使其支持多次读取输入流,然后使用Interceptor工具类`InterceptorUtils`来整合GET、RESTful和POST请求的参数。文章还提供了一个获取特定参数的方法,并在最后总结了这种方法在权限控制和缓存等方面的优点。

需求场景

request请求的参数有大概 3种,怎样一次性 都获取出来呢 ?

  1. get 请求 ?param1=hello&param2=world ,直接用request.getParameter()获取单个参数,

    或者 request.getParameterMap() 获取 多个参数为map格式

  2. restful 请求 ,借助 spring实现 (Map)request.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE)

  3. post 请求的参数,读取 stream 流 ,request.getInputStream() 获取 。 该方法只允许调用1次,因为 stream的流指针没有复位,导致后续执行会报错。因此,我们需要 提前 封装一下它的内容 到 buffer 中,曲线救国实现 多次读取 。

为什么不用aop?
实现方案 : filter + interceptor + request 参数,最干净的原始编程
  • filter 封装request对象,使其 内部的 stream 流可以 多次 读
  • interceptor 拦截每次 指定的 请求, 获取 request 对象中的 所有parameters ,并且最终 放入 1 个map 中 返回
废话少说,搞起:
  1. WrapRequestFilter 过滤器,封装request 对象,替换 原有的request,支持 多次 执行 request.getInputStream()

    /**
     * enable the ability to read request-params multiple times
     * by copying the request stream into a byte[] buffer.
     * getInputStream() & getReader() are both override to read this buffer
     *
     * @author stormfeng
     * @date 2021-08-12  10:30
     * <p>
     * reference :https://blog.youkuaiyun.com/dark_horse_lk/article/details/82344692
     */
    @WebFilter(urlPatterns = "/api/*")
    @Order(2)
    public class WrapRequestFilter extends OncePerRequestFilter {
         
         
     @Override
     protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException {
         
         
         ServletRequest requestWrapper = new BufferedServletRequestWrapper(request);
         chain.doFilter(requestWrapper, response);
     }
    
     private static class BufferedServletRequestWrapper extends HttpServletRequestWrapper {
         
         
         private byte[] buffer;
    
         public BufferedServletRequestWrapper(HttpServletRequest request) throws IOException {
         
         
             super(request);
             InputStream is = request.getInputStream();
             this.buffer = StreamUtils.copyToByteArray(is);
         }
    
         // 外部 读取字节流 的方法
         @Override
         public ServletInputStream 
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值