Spring ServletRequest Data Binder

SpringMVC提供了request中的請求參數(shù)自動(dòng)綁定到POJO的功能,但是有時(shí)候需要給指定的請求統(tǒng)一綁定某一個(gè)參數(shù),具體實(shí)現(xiàn)如下:

  1. 增加一個(gè)filter,這里使用了SpringBoot,修改filterConfig
public class FilterConfig {

    /**
     * app Filter
     */
    @Bean
    @Order(4000)
    public FilterRegistrationBean appFilter() {
        //注冊一個(gè)filter Bean
        FilterRegistrationBean bean = new FilterRegistrationBean();
        bean.setFilter(new AppInitFilter());
        //過濾的請求
        bean.addUrlPatterns(Global.getAdminPath()+"/app/*");
        return bean;
    }

2.在Filter中,我們需要給request加入一個(gè)parameter參數(shù),但是由于Request沒有提供SetParameter方法,而且ParameterMap也是不可修改的,所以使用重寫的Request:

/**
 * 請求摘要攔截器
 *
 */
public class AppInitFilter extends OncePerRequestFilter {

    /**
     * @see OncePerRequestFilter#doFilterInternal(HttpServletRequest,
     *      HttpServletResponse, FilterChain)
     */
    @Override
    protected void doFilterInternal(HttpServletRequest request,
                                    HttpServletResponse response,
                                    FilterChain filterChain) throws ServletException, IOException {
        //使用新的request
        ParameterRequestWrapper requestWrapper = new
        ParameterRequestWrapper((HttpServletRequest)request);
        //加入需要的參數(shù)
        requestWrapper.addParameter("storeCode", EmpUtils.getCompany().getCompanyCode());
        filterChain.doFilter(requestWrapper, response);
    }
}
  1. 那么Spring是如何將request綁定到Pojo的呢?
    可以看一下代碼:
ServletRequestDataBinder.bind() > WebUtils.getParametersStartingWith()

其中WebUtils.getParametersStartingWith():

public static Map<String, Object> getParametersStartingWith(ServletRequest request, String prefix) {
        Assert.notNull(request, "Request must not be null");
        Enumeration<String> paramNames = request.getParameterNames();
        Map<String, Object> params = new TreeMap();
        if(prefix == null) {
            prefix = "";
        }

        while(paramNames != null && paramNames.hasMoreElements()) {
            String paramName = (String)paramNames.nextElement();
            if("".equals(prefix) || paramName.startsWith(prefix)) {
                String unprefixed = paramName.substring(prefix.length());
                String[] values = request.getParameterValues(paramName);
                if(values != null && values.length != 0) {
                    if(values.length > 1) {
                        params.put(unprefixed, values);
                    } else {
                        params.put(unprefixed, values[0]);
                    }
                }
            }
        }

        return params;
    }

可以看出,他是通過getParameterNames遍歷request的參數(shù)的,那么我們只需要在定義的request中重寫這個(gè)方法就可以了:


public class ParameterRequestWrapper extends HttpServletRequestWrapper {

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


    @SuppressWarnings("unchecked")
    public ParameterRequestWrapper(HttpServletRequest request) {
        super(request);
        this.params.putAll(request.getParameterMap());
    }
    public ParameterRequestWrapper(HttpServletRequest request , Map<String , Object> extendParams) {
        this(request);
        addAllParameters(extendParams);
    }

    @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)});
            }
        }
    }

    private Map<String, String[]> allParameters = null;


    @Override
    public Map<String, String[]> getParameterMap() {
        if (allParameters == null) {
            allParameters = new TreeMap<String, String[]>();
            allParameters.putAll(params);
        }
        // 返回unmodifiable集合
        return Collections.unmodifiableMap(allParameters);
    }

    @Override
    public Enumeration<String> getParameterNames() {
        return Collections.enumeration(getParameterMap().keySet());
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容