修改request请求参数

Posted lishiwei

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了修改request请求参数相关的知识,希望对你有一定的参考价值。

  本质上来讲,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) 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);
        }
    }
}

 



以上是关于修改request请求参数的主要内容,如果未能解决你的问题,请参考以下文章

C#-WebForm-★内置对象简介★Request-获取请求对象Response相应请求对象Session全局变量(私有)Cookie全局变量(私有)Application全局公共变量Vi(代码片段

requests:json请求中中文乱码处理

requests不带参数的get请求和带get参数请求

Laravel $request添加数据或数据修改

Java Web 修改请求参数

Java request获取请求参数