Making a request parameter binding case insensitive

后端 未结 3 2088
南方客
南方客 2020-12-25 08:21

I have a requirement where I have to make requestParams to bind properly even if the cases of the param name changes. Note:I am using spring 3.2

For eg: http:/

3条回答
  •  无人及你
    2020-12-25 09:03

    Solution with implementing custom Filter.

    Filter:

    public final class CaseInsensitiveParametersFilter implements Filter {
    
        @Override
        public void init(FilterConfig filterConfig) {
        }
    
        @Override
        public void destroy() {
        }
    
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            if (request instanceof HttpServletRequest) {
                chain.doFilter(new CustomHttpServletRequestWrapper((HttpServletRequest) request), response);
            } else {
                chain.doFilter(request, response);
            }
    
        }
    
        private static class CustomHttpServletRequestWrapper extends HttpServletRequestWrapper {
    
            private Map lowerCaseParams = new HashMap<>();
    
            public CustomHttpServletRequestWrapper(HttpServletRequest request) {
                super(request);
                Map originalParams = request.getParameterMap();
                for (Map.Entry entry : originalParams.entrySet()) {
                    lowerCaseParams.put(entry.getKey().toLowerCase(), entry.getValue());
                }
            }
    
            @Override
            public String getParameter(String name) {
                String[] values = getParameterValues(name);
                if (values != null && values.length > 0) {
                    return values[0];
                } else {
                    return null;
                }
            }
    
            @Override
            public Map getParameterMap() {
                return Collections.unmodifiableMap(lowerCaseParams);
            }
    
            @Override
            public Enumeration getParameterNames() {
                return Collections.enumeration(lowerCaseParams.keySet());
            }
    
            @Override
            public String[] getParameterValues(String name) {
                return lowerCaseParams.get(name);
            }
    
        }
    

    Servlet initializer:

    public class RestServiceInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
        @Override
        protected Filter[] getServletFilters() {
            return new Filter[]{new CaseInsensitiveParametersFilter()};
        }
    }
    

提交回复
热议问题