本质上来讲,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请求参数的更多相关文章

  1. Fiddler 4 断点调试(修改request请求参数)

    1.选中要测试的链接 2然后点击规则的Automatic Breakpoints 的Before Requests 3.重新发送请求找到测试的点链接 最终效果如下

  2. charles功能(一)修改request请求参数

    1.接口处 鼠标右击,选择breakpoints(允许本接口使用breakpionts功能) 2.开始设置断点值 3.然后修改这一条 4.然后执行 5.最终结果

  3. request请求参数与http请求过程

    request请求参数

  4. jmeter beanShell修改http请求参数

    jmeter beanShell修改http请求参数 在使用jmeter进行测试时,需要对上一步响应的明文参数,如userName='tom' token='%sdf%sdkdfj'之类的参数,加密一 ...

  5. FiddlerScript修改特定请求参数下的返回值

    使用场景: api/Live/GetLiveList接口: (1)Type为1,接口返回直播列表 (2)Type为2,接口返回回放列表 现在想修改直播列表的返回值 思路: 利用FiddlerScrip ...

  6. asp.net中Request请求参数的自动封装

    这两天在测一个小Demo的时候发现一个很蛋疼的问题----请求参数的获取和封装,例: 方便测试用所以这里是一个很简单的表单. <!DOCTYPE html> <html xmlns= ...

  7. 2017.9.26 request请求参数用法

    4.2 访问请求参数 request对象的getParamter()方法,可以用来获取用户(客户端)提交的数据 4.2.1 访问请求参数的方法 String 自符串变量 =request.getPar ...

  8. charles功能(二)修改response请求参数

    1.接口处 鼠标右击,选择breakpoints(允许本接口使用breakpionts功能) 2.开始设置断点值 4.重新请求接口(charles的界面变为可编辑状态),修改请求参数,执行请求 5.最 ...

  9. fiddler 修改request请求

    例:在request url后追加&test=1参数 在OnBeforeRequest函数中添加以下代码 if(oSession.uriContains("www.bing.com/ ...

随机推荐

  1. Design-341. Flatten Nested List Iterator

    Given a nested list of integers, implement an iterator to flatten it. Each element is either an inte ...

  2. poj3026

    Borg Maze Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12952   Accepted: 4227 Descri ...

  3. WebBench源码分析

    源码分析共享地址:https://github.com/fivezh/WebBench 下载源码后编译源程序后即可执行: sudo make clean sudo make & make in ...

  4. (转)WebSphere 中池资源调优 - 线程池、连接池和 ORB

    WebSphere 中池资源调优 - 线程池.连接池和 ORB 来自:https://www.ibm.com/developerworks/cn/websphere/library/techartic ...

  5. JavaScript中的垃圾回收机制与内存泄露

    什么是内存泄露? 任何编程语言,在运行时都需要使用到内存,比如在一个函数中, var arr = [1, 2, 3, 4, 5]; 这么一个数组,就需要内存. 但是,在使用了这些内存之后, 如果后面他 ...

  6. mac 系统安装VM虚拟机打开时报错,提示不是虚拟磁盘的解决方式。

    最近刚买的苹果系统,不太会用,装了个虚拟机vmware fusion,好不容易把需要的软件装好,然后不知道是我操作了哪里,今天再次打开虚拟机的时候打不开了,报错提示找不到磁盘文件(虚拟磁盘-00000 ...

  7. SPSS学习系列之SPSS Modeler (简称SPSS)是什么?

    不多说,直接上干货! 推荐博客 SPSS学习系列之SPSS Statistics(简称SPSS)是什么? 官方简介: SPSS Modeler 是全球领先的数据挖掘.预测分析平台软件,拥有简单的图形界 ...

  8. Windows 添加用户

    不多说,直接干货! 欢迎大家,加入我的微信公众号:大数据躺过的坑        人工智能躺过的坑       同时,大家可以关注我的个人博客:    http://www.cnblogs.com/zl ...

  9. slq 修改表结构

    1.增加列: alter table tableName add columnName varchar(30) 2.修改列类型: alter table tableName alter column  ...

  10. 原生js动态添加style,添加样式

    原生js动态添加style,添加样式 第一种 var style="[assign-url='"+str+"']{display:initial}"; var ...