修改request请求参数,js如何取得request中的请求参

作者:计算机知识

  本质上来讲,request请求当中的参数是力不从心改换的,也不可能拉长大概去除;
  但在后台程序中,一般对request的参数的操作,都以透过request的getParameter、getParameterNames、getParameterValues等格局实行的;所以我们假诺能重写那些点子,就从侧面转移了request的央浼参数。恰好,servlet就提供了叁个HttpServletRequestWrapper类来供我们去继续(该类是HttpServletRequest的封装类,public class HttpServletRequestWrapper extends ServletRequestWrapper implements
  HttpServletRequest{}),重写request相关方法。

在上壹篇《编译Parse-SDK-JS之旅》中曾经介绍了条件设置以及编写翻译的措施,这里十分少说。

<script type="text/javascript"> 
 
document.write(location.search); 
 
修改request请求参数,js如何取得request中的请求参数。</script> 

javax.servlet.ServletRequest中的

  修改request参数的总体流程就是:会定义三个拦截器,在伏乞刚进来项指标时候,拦截住request,处理现在再将其放回。

大家后日要做的,是改造request方式。
因为微信小程序中,不能够动用xmlHttpRequest对象,只好选取官方提供的wx.request api去乞请网络财富,所以大家要修改代码,技能移植应用。

如图就足以获取请求参数
例如说大家的请求是那样子的   protected]]()

Map<String, String[]> parameterMap = request.getParameterMap();不能被修改,原因如下:

案举个例子下:

定点脚本

商量了会代码,发掘互连网请求函数在src/RESTController.js文本中,摘抄部分代码如下:

图片 1

RESTController.js

那就是说小编伸手到的结果就应当是以此样子的:
[email protected]

org/apache/tomcat/embed/tomcat-embed-core/8.0.32/tomcat-embed-core-8.0.32-sources.jar!/org/apache/catalina/util/ParameterMap.java

//@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);
        }
    }
}

修改剧本

好了,大家先是来认同下,大家必要在微信小程序中展开应用,所以如何xmlHttpRequest等等的代码,都足以去除了。
接下来大家再修改ajax措施就可以(request情势无需修改,因为它也是调用的ajax
修改实现后的代码如下:

  ajax(method: string, url: string, data: any, headers?: any) {

    var promise = new ParsePromise();
    var attempts = 0;

    var dispatch = function() {

      headers = headers || {};
      if (typeof(headers['Content-Type']) !== 'string') {
        headers['Content-Type'] = 'text/plain'; // Avoid pre-flight
      }
      // 发起请求
      wx.request({
        url, data, method, headers,
        success: (res) => {
          // 请求成功
          promise.resolve(res.data, res.statusCode, res);
        },
        fail: (res) => {
          // 请求失败
          promise.reject(res.toString());
        },
        complete: (res) => {
          // 请求完成
        }
      });
    }
    dispatch();

    return promise;
  },

于是,那个剧本看起来粗粗是这般的(确实删除了过多无效的代码,爽!)

图片 2

最终效果

写1个函数如下

    /**
     * Associate the specified value with the specified key in this map.  If
     * the map previously contained a mapping for this key, the old value is
     * replaced.
     *
     * @param key Key with which the specified value is to be associated
     * @param value Value to be associated with the specified key
     *
     * @return The previous value associated with the specified key, or
     *  <code>null</code> if there was no mapping for key
     *
     * @exception IllegalStateException if this map is currently locked
     */
    @Override
    public V put(K key, V value) {

        if (locked)
            throw new IllegalStateException
                (sm.getString("parameterMap.locked"));
        return (super.put(key, value));

    }

 

测试代码

代码修改好了,大家再度编写翻译一下,然后复制dist/parse.min.js文件到微信小程序目录,就能够利用了。

聊起底测试,开掘完美应用!

事实上在测试中,依然有个别难点,比如localStorage主题材料,那个下面讲,还应该有便是wx.request规定url无法带端口,那个请自行更换,这里只是测试代码有效性

图片 3

测试结果

附:
修改Parse-SDK-JS之旅:localStorage存储

[html]
function getUrlParam(name) { 
var reg = new RegExp("(^|&)" name "=([^&]*)(&|$)"); 
var r = window.location.search.substr(1).match(reg); 
if (r != null) 
return unescape(r[2]); 
return null; 

这么大家就会获得钦命的参数了~~~~

 

 

 

摘自 zipu888的专栏

 

type=text/javascript document.write(location.search); /script 如图就足以获取请求参数 举个例子说大家的呼吁是那样子的 ...

 

管理进程: 
(一)页面提交请求“/sa?userid=123456789&username=rensanning” 
(2)通过Filter管理加入新参数“name=newname” 
(3)sa的Servlet中forward到“/sb?myname=rensanning&mycountry=china” 
(4)sb的Servlet中变化页面输出全部参数:userid、username、myname、mycountry、name 

第一步: 
最简易,在页面上先输出一个href为改地址的链接就能够。 

 

  1. <a href="<%=request.getContextPath()%>/sa?userid=123456789&username=rensanning">Click me!!!</a>  

第二步: 
新作Filter类:ParameterFilter,配置web.xml 

 

本文由bwin必赢发布,转载请注明来源

关键词: Parse P... ParsePlatfor