• 利用过滤器对string类型的入参进行统一trim


    背景

    最近做的一些项目都是后台管理系统,主要是对表单数据的增删改查操作,其中有些表单项是字符串类型的,对于这些类型的表单项就需要在保存或编辑之前要进行.trim()处理,刚开始感觉没什么,遇到了就手动进行.trim()一下,感觉很正常,因为Java本身就提供了这么一个字符串处理的方法,感觉每次都这么做也不能嫌麻烦,理所应当。但是是随着业务的发展,需要这么处理的地方越来越多,虽然每次都小心谨慎,但难免会有遗漏,导致不该出现问题的地方出现了问题,对于这些不该出现的低级错误感到痛心。于是想,能不能写一个拦截器或者过滤器对string类型的入参进行统一trim处理,不用在数据持久化前分别对string类型的参数进行trim操作呢?于是就有了这篇文章。

    原理

    过滤器+重写HttpServletRequestWrapper类,将修改后的参数列表写回request中。

    代码示例

    第一步 编写 参数过滤器

    
    package com.xx.controller.filter;
    
    import org.springframework.web.filter.OncePerRequestFilter;
    
    import javax.servlet.FilterChain;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    /**
     * @description: 类描述:参数过滤器
     * @author: 
     * @createdate: 2019/3/10 22:33
     * @lastdate:
     */
    public class ParamsFilter extends OncePerRequestFilter {
        /**
         * Same contract as for {@code doFilter}, but guaranteed to be
         * just invoked once per request within a single request thread.
         * See {@link #shouldNotFilterAsyncDispatch()} for details.
         * <p>Provides HttpServletRequest and HttpServletResponse arguments instead of the
         * default ServletRequest and ServletResponse ones.
         *
         * @param request
         * @param response
         * @param filterChain
         */
        @Override
        protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
                ParameterRequestWrapper requestWrapper = new ParameterRequestWrapper(request);
    	    filterChain.doFilter(requestWrapper, response);
        }
    }
    
    

    第二步 重写 ParameterRequestWrapper

    package com.jd.lifetravel.assistincome.controller.filter;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletRequestWrapper;
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.Map;
    import java.util.Set;
    
    /**
     * @description: 类描述:重写 ParameterRequestWrapper
     * @author:
     * @createdate: 2019/3/10 22:35
     * @lastdate:
     */
    public class ParameterRequestWrapper extends HttpServletRequestWrapper {
        private Map<String, String[]> params = new HashMap<String, String[]>();
    
    
        public ParameterRequestWrapper(HttpServletRequest request) {
            // 将request交给父类,以便于调用对应方法的时候,将其输出,其实父亲类的实现方式和第一种new的方式类似
            super(request);
            // 将参数表,赋予给当前的Map以便于持有request中的参数
            this.params.putAll(request.getParameterMap());
            this.modifyParameterValues();
    
        }
    
        /**
         * 重载一个构造方法
         *
         * @param request
         * @param extendParams
         */
        public ParameterRequestWrapper(HttpServletRequest request, Map<String, Object> extendParams) {
            this(request);
            addAllParameters(extendParams);
        }
    
        /**
         * 将parameter的值去除空格后重写回去
         */
        public void modifyParameterValues() {
            Set<String> set = params.keySet();
            Iterator<String> it = set.iterator();
            while (it.hasNext()) {
                String key = (String) it.next();
                String[] values = params.get(key);
                values[0] = values[0].trim();
                params.put(key, values);
            }
        }
    
        /**
         * 重写getParameter,代表参数从当前类中的map获取
         *
         * @param name
         * @return
         */
        @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);
        }
    
        public void addAllParameters(Map<String, Object> otherParams) {//增加多个参数
            for (Map.Entry<String, Object> entry : otherParams.entrySet()) {
                addParameter(entry.getKey(), entry.getValue());
            }
        }
    
        public void addParameter(String name, Object value) {//增加参数
            if (value != null) {
                if (value instanceof String[]) {
                    params.put(name, (String[]) value);
                } else if (value instanceof String) {
                    params.put(name, new String[]{(String) value});
                } else {
                    params.put(name, new String[]{String.valueOf(value)});
                }
            }
        }
    
    }
    
    

    第三步 在web.xml配置过滤器

    	<filter>  
    	    <filter-name>ParamsFilter</filter-name>  
    	    <filter-class>top.lushunde.interceptor.ParamsFilter</filter-class>  
    	</filter>  
    	<filter-mapping>  
    	    <filter-name>ParamsFilter</filter-name>  
    	    <url-pattern>/*</url-pattern>  
    	</filter-mapping> 
    
  • 相关阅读:
    jsonrpc
    第十章:多线程
    第九章:IO流
    第八章:集合
    第七章:常用类
    第六章:异常机制
    第四章:数组
    第三章:流程控制语句
    第二章:数据类型和运算符
    第五章:面向对象4
  • 原文地址:https://www.cnblogs.com/luao/p/10508054.html
Copyright © 2020-2023  润新知