修改request请求参数
Posted lishiwei
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了修改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); } } }
以上是关于修改request请求参数的主要内容,如果未能解决你的问题,请参考以下文章
C#-WebForm-★内置对象简介★Request-获取请求对象Response相应请求对象Session全局变量(私有)Cookie全局变量(私有)Application全局公共变量Vi(代码片段