SpringBoot 参数 trim 处理

Posted l_learning

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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);
                    
                
            
        
    


以上是关于SpringBoot 参数 trim 处理的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot 参数 trim 处理

从SQLServer里面取出数据,去掉头尾的空格

去除字符串头尾空格的方法

C语言 如何利用trim函数出除字符串头尾的指定字符

trimws函数——去掉字符串头尾的空格

String类的trim()方法