最近发现不能修改request的参数内容,假如想要在request的paramMap里面默认注入modifier内容,采用下面这种方法可以实现向request中修改参数,具体分析如下:
(1)继承HttpServletRequestWrapper,全名javax.servlet.http.HttpServletRequestWrapper看来也是一个扩展的通用接口,也就是会对request做一次包装,此时我们要如何重写?比如我们要重写getParameter方法和getParameterValues方法,其他方法保存和原来一样,我们在子类中,自己定义一个map用来放对象,结合request本身的参数,加上外部其他自定义的参数,做成一个新的参数表。
(1)继承HttpServletRequestWrapper,全名javax.servlet.http.HttpServletRequestWrapper看来也是一个扩展的通用接口,也就是会对request做一次包装,此时我们要如何重写?比如我们要重写getParameter方法和getParameterValues方法,其他方法保存和原来一样,我们在子类中,自己定义一个map用来放对象,结合request本身的参数,加上外部其他自定义的参数,做成一个新的参数表。
package com.cx.web;
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());
this.modifyParameterValues();
}
//重载一个构造方法
public ParameterRequestWrapper(HttpServletRequest request, Map<String, Object> extendParams) {
this(request);
addAllParameters(extendParams);//这里将扩展参数写入参数表
}
public void modifyParameterValues() {//将parameter的值去除空格后重写回去
Set<String> set = params.keySet();
Iterator<String> it = set.iterator();
while (it.hasNext()) {
String key = (String) it.next();
String[] values = params.get(key);
for (int i = 0; i < values.length; i++) {
values[i] = values[i].trim();
}
params.put(key, values);
}
}
@Override
public Enumeration<String> getParameterNames() {
return new Vector<String>(params.keySet()).elements();
}
@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)});
}
}
}
}
(2)接下来我们说下new出来的request如何使用,以及让业务层使用到,方法如下:写一个过滤器,在filter这个地方new了这个自己定义的request后,接下来request就是new出来的,这个filter一定要在springmvc之前处理,如下所示:
ParameterRequestWrapper requestWrapper = new ParameterRequestWrapper((HttpServletRequest)request);
requestWrapper.addParameter("fff" , "我靠");
filterChain.doFilter(requestWrapper, servletResponse);
具体的方法如下:package com.cx.web;
public class CommonFilter implements Filter {
public CommonFilter() {
}
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest hr = (HttpServletRequest) request;
long start = System.currentTimeMillis();
String url = hr.getServletPath().trim();
ParameterRequestWrapper requestWrapper = new ParameterRequestWrapper((HttpServletRequest) request);
chain.doFilter(requestWrapper, response);
long end = System.currentTimeMillis();
System.out.println("============================连接:" + url + ",响应时间:" + (end - start));
}
public void init(FilterConfig fConfig) throws ServletException {
}
}
(3)在web.xml中添加转化器
<!--去参数的左右空格,也可以用springMVC拦截器实现-->
<filter>
<filter-name>commonFilter</filter-name>
<filter-class>com.cx.web.CommonFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>commonFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>