zoukankan      html  css  js  c++  java
  • 修改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);
            }
        }
    }
  • 相关阅读:
    JVM调优(一)——参数查询和问题排查
    spring-cloud feign (web服务客户端)(四)
    spring-cloud hystrix(三)
    springCloud ribbon均衡负载的配置及原理 (二)
    maven
    springCloud Eureka 注册中心原理及配置理解(一)
    threadLocal 的使用及意义
    数据库引擎类型
    sql 优化
    sql 的执行计划理解
  • 原文地址:https://www.cnblogs.com/lishiwei/p/9473791.html
Copyright © 2011-2022 走看看