修改request請求參數
阿新 • • 發佈:2018-08-14
oid key asm json格式 ons per obj 封裝 整體
本質上來講,request請求當中的參數是無法更改的,也不能添加或者刪除;
但在後臺程序中,一般對request的參數的操作,都是通過request的getParameter、getParameterNames、getParameterValues等方法執行的;所以我們要是能重寫這些方法,就從側面改變了request的請求參數。恰好,servlet就提供了一個HttpServletRequestWrapper類來供大家去繼承(該類是HttpServletRequest的封裝類,public class HttpServletRequestWrapper extends ServletRequestWrapper implements
HttpServletRequest{}),重寫request相關方法。
修改request參數的整體流程就是:會定義一個攔截器,在請求剛進入項目的時候,攔截住request,處理之後再將其放回。
案例如下:
//@WebFilter(filterName = "paramFilter", urlPatterns = "/*")//攔截器攔截所有請求 //@Order(100)//括號中的數字越大,在多個攔截器的執行順序越靠前 public class ParamFilter extends OncePerRequestFilter{ @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throwsServletException, IOException { HttpServletRequest wrapper = new RequestWrapper(request);//定義一個新的request(名稱是wrapper), filterChain.doFilter(wrapper, response);//將修改過的request(wrapper)放回 } private static class RequestWrapper extends HttpServletRequestWrapper {//這裏用的是內部類,也可以不用private Map<String, String[]> params = new HashMap<String, String[]>();//將request對象中的參數修改後,放在這個集合裏,隨後項目取的所有Parameter都是從這個集合中取數 public RequestWrapper(HttpServletRequest request) {//定義構造函數 super(request);//將request交給父類 //先通過request原生的方法,遍歷獲取到的參數 Enumeration enu=request.getParameterNames(); while (enu.hasMoreElements()) { String paraName=(String)enu.nextElement(); Map<String, Object> paraObj = (Map<String, Object>)JSONUtils.parse(paraName);//因為我前臺傳過來的是json格式的參數 Set<Entry<String, Object>> entrySet = paraObj.entrySet(); for (Entry<String, Object> entry : entrySet) { String key = entry.getKey(); Object value = entry.getValue(); params.put(key, value);// } } //在這裏修改params中的數據,不管是添加、修改 ...... //將修改好的params重新放入RequestWrapper對象中 addParameters(request,params); } public void addAllParameters(Map<String , Object>otherParams) {//增加多個參數 for(Map.Entry<String , Object>entry : otherParams.entrySet()) { addParameter(entry.getKey() , entry.getValue()); } } @Override public String getParameter(String name) { String[]values = params.get(name); if(values == null || values.length == 0) { return null; } return StringEscapeUtils.escapeHtml4(values[0]); } @Override public Enumeration<String> getParameterNames() { Vector<String> v = new Vector<String>(); Set<Entry<String, String[]>> entrySet = params.entrySet(); for (Entry<String, String[]> entry : entrySet) { v.add(entry.getKey()); } Enumeration<String> en = v.elements(); return v.elements(); } @Override public String[] getParameterValues(String name) { return params.get(name); } } }
修改request請求參數