修改Request的请求路径

本文章介绍关于如何修改Request的请求路径,不是请求转发,也不是重定向。

介绍源码

如果要修改Request的请求路径,就得知道路径是保存在哪个类的哪个字段里面。
跟踪源码可知路径是保存在org.apache.coyote.Request这个类的uriMB这个字段里面,uriMB是一个MessageBytes类型,MessageBytes中使用strValue保存路径,而且在MessageBytes类中为strValue提供了setter,getter方法,所以你可以调用setter来改变请求路径。因此Request的路径最终是保存在MessageBytesstrValue字段中。
但是光知道路径的保存字段还不够,还得知道在哪里调用。我在这里仅仅说下大概涉及到的类。
org.apache.catalina.connector.RequestFacade;:
org.apache.catalina.connector.Request
org.apache.coyote.Request

编写代码

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() {

    }
}
  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值