修改request請求參數

  本質上來說,request請求當中的參數是沒法更改的,也不能添加或者刪除;
  但在後臺程序中,通常對request的參數的操做,都是經過request的getParameter、getParameterNames、getParameterValues等方法執行的;因此咱們要是能重寫這些方法,就從側面改變了request的請求參數。剛好,servlet就提供了一個HttpServletRequestWrapper類來供你們去繼承(該類是HttpServletRequest的封裝類,public class HttpServletRequestWrapper extends ServletRequestWrapper implements
  HttpServletRequest{}),重寫request相關方法。json

  修改request參數的總體流程就是:會定義一個過濾器,在請求剛進入項目的時候,對request處理以後再將其放回。app

案例以下:ide

//@WebFilter(filterName = "paramFilter", urlPatterns = "/*")//過濾器攔截全部請求
//@Order(100)//括號中的數字越大,在多個過濾器的執行順序越靠前
public class ParamFilter extends OncePerRequestFilter{

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, 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);
        }
    }
}
相關文章
相關標籤/搜索