//@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);
}
}
}
import org.apache.catalina.connector.RequestFacade;
import org.apache.coyote.Request;
import org.apache.tomcat.util.buf.MessageBytes;
import javax.servlet.*;
import java.io.IOException;
import java.lang.reflect.Field;
import static javax.swing.UIManager.get;
public class ParseURLFilter implements Filter{
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println(servletRequest);
RequestFacade facade= (RequestFacade) servletRequest;
Class clzz=RequestFacade.class;
try {
Field field=clzz.getDeclaredField("request");
field.setAccessible(true);
org.apache.catalina.connector.Request request=(org.apache.catalina.connector.Request) field.get(facade);
Class requestClass=request.getClass();
//获取封装org.apache.coyote.Request的字段
Field coyoteField=requestClass.getDeclaredField("coyoteRequest");
coyoteField.setAccessible(true);
Request coyoteRequest=(Request)coyoteField.get(request);
Class requestClazz=Request.class;
//获取org.apache.coyote.Request中保存路径的字段
Field uriMBField= requestClazz.getDeclaredField("uriMB");
uriMBField.setAccessible(true);
MessageBytes uriMB=(MessageBytes)uriMBField.get(coyoteRequest);
//这里就是改变路径的地方
String path=uriMB.getString()+"dd";
uriMB.setString(path);
filterChain.doFilter(facade,servletResponse);
//用来打印请求路径
System.out.println(((RequestFacade) servletRequest).getRequestURL());
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
@Override
public void destroy() {
}
}