springboot中使用filter来修改body里的参数

在这里, 以去空格为例来进行说明.

背景:在项目中, 经常会遇到前端往后端传参会有字符串参数首尾有空格的情况, 一般如果字段比较少, 或者接口比较少, 自行在controller位置处理一下, 是没有问题的. 就是重复代码多, 工作重复, 没劲.

所以在这里以去空格说明如何处理post方法里的参数首尾空格问题.

  1. 自定义filter.
public class ParamsFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
                         FilterChain filterChain) throws IOException, ServletException {
        //去空格处理
        TrimReqParamWrapper trimReqParamWrapper = new TrimReqParamWrapper((HttpServletRequest) request);
        filterChain.doFilter(trimReqParamWrapper, response);
    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {

    }

    @Override
    public void destroy() {

    }

}
  1. 对request进行处理.
public class TrimReqParamWrapper extends HttpServletRequestWrapper {

    LogTool logger = LogTool.getLogger(TrimReqParamWrapper.class);

    public TrimReqParamWrapper(HttpServletRequest request) {
        super(request);
        // 由于我们只做POST请求, 所以这里不做任何处理
    }


    /**
     * 重写getInputStream方法
     */
    @Override
    public ServletInputStream getInputStream() throws IOException {
        logger.debug("参数去空格处理");

   
  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Spring Boot,HTTP请求的Body只能被读取一次,因此如果Filter已经读取了Body,那么Controller就无法再次读取Body了。为了解决这个问题,可以使用HttpServletRequestWrapper来包装HttpServletRequest,从而在Filter读取Body后,仍然可以将HttpServletRequest传递给Controller。 以下是一个示例代码: ```java public class BodyReaderHttpServletRequestWrapper extends HttpServletRequestWrapper { private final byte[] body; public BodyReaderHttpServletRequestWrapper(HttpServletRequest request) throws IOException { super(request); body = IOUtils.toByteArray(request.getInputStream()); } @Override public ServletInputStream getInputStream() throws IOException { return new ServletInputStreamWrapper(body); } @Override public BufferedReader getReader() throws IOException { ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body); return new BufferedReader(new InputStreamReader(byteArrayInputStream)); } } ``` 然后,在Filter使用BodyReaderHttpServletRequestWrapper来包装HttpServletRequest: ```java public class BodyReaderFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpServletRequest = (HttpServletRequest) request; BodyReaderHttpServletRequestWrapper requestWrapper = new BodyReaderHttpServletRequestWrapper(httpServletRequest); chain.doFilter(requestWrapper, response); } } ``` 这样,在Controller就可以正常获取到请求的Body了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值