修改request请求参数

(21) 2024-02-01 17:12

Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说修改request请求参数,希望能够帮助你!!!。

本质上来讲,request请求当中的参数是无法更改的,也不能添加或者删除;

但在后台程序中,一般对request的参数的操作,都是通过request的getParameter、getParameterNames、getParameterValues等方法执行的;所以我们要是能重写这些方法,就从侧面改变了request的请求参数。恰好,servlet就提供了一个HttpServletRequestWrapper类来供大家去继承(该类是HttpServletRequest的封装类,public class HttpServletRequestWrapper extends ServletRequestWrapper implements

HttpServletRequest{}),重写request相关方法。

如果想学习Java工程化、高性能及分布式、深入浅出。微服务、Spring,MyBatis,Netty源码分析的朋友可以加我的Java高级交流:854630135,群里有阿里大牛直播讲解技术,以及Java大型互联网技术的视频免费分享给大家。

修改request参数的整体流程就是:会定义一个拦截器,在请求刚进入项目的时候,拦截住request,处理之后再将其放回。

案例如下:

如果想学习Java工程化、高性能及分布式、深入浅出。微服务、Spring,MyBatis,Netty源码分析的朋友可以加我的Java高级交流:854630135,群里有阿里大牛直播讲解技术,以及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);
 }
 }
}

今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

上一篇

已是最后文章

下一篇

已是最新文章

发表回复