一般情況下,在servlet中出於安全考慮是不允許修改request請求中的內容,但是在很多場景中,卻有這樣的需求,如在springmvc中從一個controller轉發到另一個功能相同的controller,但是參數有差異,需要修改或補充參數。這就需要修改request請求中的參數,HttpServletRequest只提供了getParameter()方法,無法set,為了實現這種操作,servlet提供了HttpServletRequestWrapper類,HttpServletRequestWrapper是裝飾器模式的經典實現,通過繼承HttpServletRequestWrapper類型,可以重寫Parameter系列方法,這樣就實現了自定義的request請求。代碼如下:
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; public class ParameterRequestWrapper extends HttpServletRequestWrapper { private Map<String, String[]> params = new HashMap<>(); 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 Enumeration<String> getParameterNames() { return new Vector(params.keySet()).elements(); } @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) { String[] values = params.get(name); if (values == null || values.length == 0) { return null; } return values; } private void addAllParameters(Map<String, Object> otherParams) { for (Map.Entry<String, Object> entry : otherParams.entrySet()) { addParameter(entry.getKey(), entry.getValue()); } } 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)}); } } } }
有了上面自定義request,就可以在如下的場景使用改變request的參數。
- 1、在過濾器中使用
Map<String, Object> param = new HashMap<>(); //自定義參數 param.put("watermark", "1231414"); param.put("watermarkFontSize", "123123"); ParameterRequestWrapper pr = new ParameterRequestWrapper(httpServletRequest, param); filterChain.doFilter(pr, response);
- 2、在springMVC中轉發
Map<String, Object> param = new HashMap<>(); //自定義參數 param.put("watermark", "1231414"); param.put("watermarkFontSize", "123123"); ParameterRequestWrapper pr = new ParameterRequestWrapper(request, param); request.getRequestDispatcher("/general/openApi").forward(pr, response); // 轉發