SpringBoot 参数 trim 处理

前端传值时可能将参数值前后带了空格,这些空格可能引发一些异常,如:equals 两个值应该是true的,但因为有了前后空格的原因出现false,对用户来说是不可接受的。

基于以上场景这里使用 Filter 去掉参数值的前后空格

1. 配置过滤器

import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.servlet.DispatcherType;

@Configuration
public class FilterConfig {

    /**
     * 添加去除参数头尾空格过滤器
     * @return
     */
    @Bean
    public FilterRegistrationBean trimFilter() {
        FilterRegistrationBean registration = new FilterRegistrationBean();
        registration.setDispatcherTypes(DispatcherType.REQUEST);
        registration.setFilter(new RequestTrimFilter());
        registration.addUrlPatterns("/*");
        registration.setName("RequestTrimFilter");
        registration.setOrder(Integer.MAX_VALUE - 1);
        return registration;
    }
}

2. 新建参数过滤器

RequestTrimHttpServletRequestWrapper 请求参数包装器

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

/**
 * 请求参数过滤器
 */
public class RequestTrimFilter implements Filter {

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        filterChain.doFilter(new RequestTrimHttpServletRequestWrapper((HttpServletRequest) servletRequest), servletResponse);
    }

}

3. 参数 trim 处理

import com.alibaba.fastjson.JSONObject;
import com.example.demo.utils.JsonUtils;
import org.apache.commons.io.IOUtils;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.util.StringUtils;

import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

/**
 * 请求参数trim处理
 */
public class RequestTrimHttpServletRequestWrapper extends HttpServletRequestWrapper {

    private static final String CHARSET = "utf-8";

    private Map<String , String[]> params = new HashMap<>();

    public RequestTrimHttpServletRequestWrapper(HttpServletRequest request) {
        //将request交给父类,调用对应方法的时候,将其输出
        super(request);
        //持有request中的参数
        this.params.putAll(request.getParameterMap());
        this.modifyParameterValues();
    }
    
    /**
     * post类型的请求参数必须通过流才能获取到值
     */
    @Override
    public ServletInputStream getInputStream() throws IOException {
        //非json类型,直接返回
        if(!MediaType.APPLICATION_JSON_VALUE.equalsIgnoreCase(super.getHeader(HttpHeaders.CONTENT_TYPE))){
            return super.getInputStream();
        }
        //为空,直接返回
        String json = IOUtils.toString(super.getInputStream(), CHARSET);
        if (!StringUtils.hasLength(json)) {
            return super.getInputStream();
        }
        JSONObject jsonObject = JsonUtils.jsonTrim(json);
        byte[] bytes = jsonObject.toJSONString().getBytes(CHARSET);
        ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
        return new MyServletInputStream(bis);
    }

    /**
     * 将parameter的值去除空格后重写回去
     */
    public void modifyParameterValues(){
        Set<String> set =params.keySet();
        Iterator<String> it=set.iterator();
        while(it.hasNext()){
            String key= it.next();
            String[] values = params.get(key);
            for (int i = 0; i < values.length; i++) {
                values[i] = values[i].trim();
            }
            params.put(key, values);
        }
    }

    /**
     * 从当前类中map获取参数
     */
    @Override
    public String getParameter(String name) {
        String[] values = params.get(name);
        if(values == null || values.length == 0) {
            return null;
        }
        return values[0];
    }

    @Override
    public String[] getParameterValues(String name) {
        return params.get(name);
    }

    class MyServletInputStream extends  ServletInputStream{
        private ByteArrayInputStream bis;
        public MyServletInputStream(ByteArrayInputStream bis){
            this.bis=bis;
        }
        @Override
        public boolean isFinished() {
            return true;
        }

        @Override
        public boolean isReady() {
            return true;
        }

        @Override
        public void setReadListener(ReadListener listener) {

        }
        @Override
        public int read() {
            return bis.read();
        }
    }

}

4. JSON 去空格工具类

/**
 * json trim工具类
 */
public class JsonUtils {

    private JsonUtils() {
    }

    /**
     * 去除json值前后空格
     * @param jsonStr
     * @return
     */
    public static JSONObject jsonTrim(String jsonStr) {
        return jsonTrim(JSONObject.parseObject(jsonStr));
    }

    /**
     * 去除value的空格
     * @param jsonObject
     * @return
     */
    public static JSONObject jsonTrim(JSONObject jsonObject) {
        Iterator<Map.Entry<String, Object>> iterator = jsonObject.entrySet().iterator();
        while (iterator.hasNext()) {
            Map.Entry<String, Object> next = iterator.next();
            Object value = next.getValue();
            if (value != null) {
                if (value instanceof String) {
                    //清空值前后空格
                    jsonObject.put(next.getKey(), ((String) value).trim());
                } else if (value instanceof JSONObject) {
                    jsonTrim((JSONObject) value);
                } else if (value instanceof JSONArray) {
                    jsonTrimArray((JSONArray) value);
                }
            }
        }
        return jsonObject;
    }

    /**
     * JSONArray 值前后空格
     * @param array
     */
    private static void jsonTrimArray(JSONArray array) {
        if (array.size() > 0) {
            for (int i = 0; i < array.size(); i++) {
                Object object = array.get(i);
                if (object != null) {
                    if (object instanceof String) {
                        array.set(i, ((String) object).trim());
                    } else if (object instanceof JSONObject) {
                        jsonTrim((JSONObject) object);
                    } else if (object instanceof JSONArray) {
                        jsonTrimArray((JSONArray) object);
                    }
                }
            }
        }
    }

}
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可以通过自定义过滤器来实现参数前后端空格的过滤。具体实现步骤如下: 1. 创建一个自定义的过滤器类,实现javax.servlet.Filter接口。 2. 在过滤器类中重写doFilter方法,在该方法中对参数进行空格过滤处理。 3. 在SpringBoot的配置类中添加一个FilterRegistrationBean注册过滤器,并设置过滤器的优先级。 下面是一个示例代码: ```java @Component public class SpaceFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; Map<String, String[]> parameterMap = req.getParameterMap(); for (Map.Entry<String, String[]> entry : parameterMap.entrySet()) { String[] values = entry.getValue(); for (int i = 0; i < values.length; i++) { values[i] = values[i].trim(); } entry.setValue(values); } chain.doFilter(request, response); } } @Configuration public class WebConfig { @Bean public FilterRegistrationBean<SpaceFilter> spaceFilter() { FilterRegistrationBean<SpaceFilter> registrationBean = new FilterRegistrationBean<>(); registrationBean.setFilter(new SpaceFilter()); registrationBean.addUrlPatterns("/*"); registrationBean.setName("SpaceFilter"); registrationBean.setOrder(Ordered.HIGHEST_PRECEDENCE); return registrationBean; } } ``` 在上面的示例中,我们通过SpaceFilter类对所有请求的参数进行了空格过滤处理,并将该过滤器设置为最高优先级,确保所有请求都会经过该过滤器。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值