1. 程式人生 > >request對象添加額外的參數

request對象添加額外的參數

需要 唯一id else value 很多 port 接口 -- parameter

分析在很多的業務場景中會,過濾器的存在。過濾器的存在主要作用是past非法請求參數。

但是也可以動態進行添加請求參數。

比如說動態的添加當前請求的唯一ID標識、轉義一些非法的或者具有工具性的字符(XSS)。

實現:為了能夠改變請求參數,要重寫javax.servlet.http.HttpRequestWrapper這個類.

然後定義一個成員Map變量,用於存儲request請求參數,覆蓋getParameter()方法。

package com.eastrobot.robotdev.filter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper; import java.util.Enumeration; import java.util.HashMap; import java.util.Map; import java.util.Vector; /** * <p>向filter過濾器中的request對象添加額外的參數</p><br> * TODO(重寫 HttpServletRequestWrapper) * * @author han.sun * @version
1.0.0 * @since 2019/5/5 13:42 */ public class RequestParameterWrapper extends HttpServletRequestWrapper { private Map<String, String[]> params = new HashMap<>(); /** * 獲取所有參數名 * * @return all parameter names */ @Override public Enumeration<String> getParameterNames() { Vector
<String> vector = new Vector<>(params.keySet()); return vector.elements(); } @Override public Map<String, String[]> getParameterMap() { return params; } /** * 重載構造函數 * * @param request HttpServletRequest */ public RequestParameterWrapper(HttpServletRequest request) { super(request); //將現有parameter傳遞給params this.params.putAll(request.getParameterMap()); } /** * override構造器 * * @param request HttpServletRequest * @param extraParams 自定義參數Map */ RequestParameterWrapper(HttpServletRequest request, Map<String, Object> extraParams) { this(request); addParameters(extraParams); } /** * 添加參數 * * @param extraParams 自定義參數Map */ private void addParameters(Map<String, Object> extraParams) { for (Map.Entry<String, Object> entry : extraParams.entrySet()) { addParameter(entry.getKey(), entry.getValue()); } } /** * 添加參數 * * @param name key * @param value value */ private 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)}); } } } /** * 重寫getParameter,參數從當前類中的map獲取 * * @param name key * @return value */ @Override public String getParameter(String name) { String[] values = params.get(name); if (values == null || values.length == 0) { return null; } return values[0]; } /** * 重寫getParameter,參數從當前類中的map獲取 * * @param name key * @return value */ @Override public String[] getParameterValues(String name) { return params.get(name); } }

業務場景:在自定義一個參數過濾器,實現Filter接口,重寫doFilter()方法.

package com.eastrobot.robotdev.filter;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
 * <p>filter---參數過濾器</p><br>
 * TODO(設置自定義request參數)
 *
 * @author han.sun
 * @version 1.0.0
 * @since 2019/5/5 13:12
 */
public class RequestParameterFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) {
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        Map<String, Object> map = new HashMap<>(16);
     // 具體的業務場景,需要添加的字段 map.put(
"imgId", new String[]{System.currentTimeMillis() + ""}); RequestParameterWrapper requestParameterWrapper = new RequestParameterWrapper(request, map); chain.doFilter(requestParameterWrapper, servletResponse); } @Override public void destroy() { } }

備註:以上效果修改請求參數、添加字段的條件:

1、當接口請求參數沒有請求該字段。(可以添加param以及它的value)

2、接口請求了該字段,但是為NULL。(可以修改該字段value)

3、接口請求了該字段,但是不為NULL。(Filter失效,如果使用springmvc,當接口請求到controller層後,該字段會是原來的value,而不是Filter過濾後的)

4、補充3說明的,如果使用request.getParameter("##"),那麽就可以實現。

request對象添加額外的參數