如何修改request的parameter的几种方式

Posted

tags:

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

request之所以不想让你修改parameter的值,就是因为这个东西一般不然
改,有人问我为什么不让改,表面上说我只能说这属于篡改数据,因为这个使用户的请求数据,如果被篡改就相当于篡改消息,如果你一天给别人发消息发的是:你
好,而对方收到的是:fuck you!,你会怎么想,呵呵!当然它主要是怕不安全把参数数据该乱了,因为程序员
毕竟是自己写程序,尤其是在公共程序里面写,后台程序员发现自己的数据不对,也找不到原因;一般WEB应用会提供一个attribute来提供自己的参数
设置,这样就OK了,但是有些人就是那么变态说为啥就不能改呢,面向对象不是相互的么,有get应该有set的呀,我只能说,面向对象来自于生活现实,生
活现实中每天逛大街,街上有很多形形色色如花似玉的,但是又可能你只能看,不能摸,更不能XX,呵呵,否则一个异常就出来了:臭流氓!
呵呵,不过就技术的角度来讲,能实现吗,当然可以,没有不可以实现的,源码之下,了无秘密,这是一个大牛说的,那么我们先来思考下有那些实现的方式:

1、我自己new一个request,然后放到容器里头,放那呢?等会来说,先记录下。

2、如果我能改掉request里面的值,那就好了呗,好的,先记录下,等会来想怎么改。

先说第一种方式,我自己new一个,呵呵,怎么new,怎么让其他的程序知道。

new的两种方式之一(开始思考的起源):

先说new的方式,在不知道具体的容器怎么实现HttpSevletRequest的时候,很简单,我自己写个类,implements HttpServletRequest呵呵,这个貌似很简单,OK,继承下试一试:
public class HttpServletRequestExtend implements HttpServletRequest
.......实现代码


此时提示需要有N多方法需要被实现,例如:

getParameter、getAttribute、getAttributeNames、getCharacterEncoding、getContentLength、getContentType。。。。。。

等等几十个方法,呵呵;

当然,你可以再构造方法里面将实际的request对象传递进来,如果是相同的方法,就这个request来实现,如果需要自己处理的方法,就按照自己的方式来处理,这种包装貌似简单

自己定义parameter,就用一个
private Map<String , String[]>paramterMap = new HashMap<String , String[]>();

就可以简单搞定,自己再搞个addParameter方法等等,就可以实现自己的功能。

不过写起来挺费劲的,因为意味着你所有的方法都要去实现下,除非你其他的方法都不用,只用其中几个方法而已,这就体现出一些接口的不足了。

但是这种方式是可行的,至少可以这样说,只是很费劲而已,因为感觉冗余很厉害,也体现出接口的不足,和抽象类的价值,我们想要的只是重载那些我们想要重载的,原有的还是按照它原有的处理思路,此时,有一个叫HttpServletRequestWrapper的出现了;

new方式2:

继承HttpServletRequestWrapper,其实就是上面那种方法多了一层继承,将你的重复工作交予了它,你也可以这样做,

全名
为:javax.servlet.http.HttpServletRequestWrapper,看来也是一个扩展的通用接口,也就是会对
request做一次包装,OK;跟着进去发现它可以处理类似request一样的差不多的内容,在这个基础上做了一次包装,你可以认为他就是对你自己
new的那个,多了一层简单扩展实现,而你再这个基础上,可以继续继承和重写。

OK,此时你要重写如何重写呢,比如我们要重写一个getParameter方法和
getParameterValues方法,其余的方法保持和原来一致,我们在子类中,自己定义一个Map用来放参数,结合request本身的参数,加
上外部其他自定义的参数,做成一个新的参数表。

如下所示:
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.util.HashMap;
import java.util.Map;
public class ParameterRequestWrapper extends HttpServletRequestWrapper

private Map<String , String[]> params = new HashMap<String, String[]>();

@SuppressWarnings("unchecked")
public ParameterRequestWrapper(HttpServletRequest request)
// 将request交给父类,以便于调用对应方法的时候,将其输出,其实父亲类的实现方式和第一种new的方式类似
super(request);
//将参数表,赋予给当前的Map以便于持有request中的参数
this.params.putAll(request.getParameterMap());

//重载一个构造方法
public ParameterRequestWrapper(HttpServletRequest request , Map<String , Object> extendParams)
this(request);
addAllParameters(extendObject);//这里将扩展参数写入参数表


@Override
public String getParameter(String name) //重写getParameter,代表参数从当前类中的map获取
String[]values = params.get(name);
if(values == null || values.length == 0)
return null;

return values[0];


public String[] getParameterValues(String name) //同上
return params.get(name);


public void addAllParameters(Map<String , Object>otherParams) //增加多个参数
for(Map.Entry<String , Object>entry : otherParams.entrySet())
addParameter(entry.getKey() , entry.getValue());



public void addParameter(String name , Object value) //增加参数
if(value != null)
if(value instanceof String[])
params.put(name , (String[])value);
else if(value instanceof String)
params.put(name , new String[] (String)value);
else
params.put(name , new String[] String.valueOf(value));



参考技术A request之所以不想让你修改parameter的值,就是因为这个东西一般不然
改,有人问我为什么不让改,表面上说我只能说这属于篡改数据,因为这个使用户的请求数据,如果被篡改就相当于篡改消息,如果你一天给别人发消息发的是:你
好,而对方收到的是:fuck you!,你会怎么想,呵呵!当然它主要是怕不安全把参数数据该乱了,因为程序员
毕竟是自己写程序,尤其是在公共程序里面写,后台程序员发现自己的数据不对,也找不到原因;一般WEB应用会提供一个attribute来提供自己的参数
设置,这样就OK了,但是有些人就是那么变态说为啥就不能改呢,面向对象不是相互的么,有get应该有set的呀,我只能说,面向对象来自于生活现实,生
活现实中每天逛大街,街上有很多形形色色如花似玉的,但是又可能你只能看,不能摸,更不能XX,呵呵,否则一个异常就出来了:臭流氓!
呵呵,不过就技术的角度来讲,能实现吗,当然可以,没有不可以实现的,源码之下,了无秘密,这是一个大牛说的,那么我们先来思考下有那些实现的方式:

1、我自己new一个request,然后放到容器里头,放那呢?等会来说,先记录下。

2、如果我能改掉request里面的值,那就好了呗,好的,先记录下,等会来想怎么改。

先说第一种方式,我自己new一个,呵呵,怎么new,怎么让其他的程序知道。

new的两种方式之一(开始思考的起源):

先说new的方式,在不知道具体的容器怎么实现HttpSevletRequest的时候,很简单,我自己写个类,implements HttpServletRequest呵呵,这个貌似很简单,OK,继承下试一试:
public class HttpServletRequestExtend implements HttpServletRequest
.......实现代码


此时提示需要有N多方法需要被实现,例如:

getParameter、getAttribute、getAttributeNames、getCharacterEncoding、getContentLength、getContentType。。。。。。

后端接收Request请求参数的几种方式

以上是关于如何修改request的parameter的几种方式的主要内容,如果未能解决你的问题,请参考以下文章

修改QueryDict的几种方式

修改QueryDict的几种方式

requests常见的几种解码方式

如何在 Springboot 获取 http request和 http response 的几种方式

Spring中获取request的几种方法,及其线程安全性分析

Java 修改编码格式的几种方式