修改request请求参数

本文深入探讨了使用Java实现的自定义HTTP请求拦截器和URL解析过滤器的详细过程。通过对请求参数的重新包装和修改,以及对URL路径的动态调整,展示了如何增强Web应用程序的功能和安全性。
//@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() {

    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值