在Filter过滤器中使用req.getPathInfo方法的返回值问题

  

    当一个请求发生,比如说是 http://localhost/text/servlet/1则会产生在服务器中实例化一个request内置对象,

        并且分析请求对象的路径的信息,比如该对象请求路径tmall/text/1不是实际存在的目录,

        服务器则会将请求对象和响应对象提交给配置文件中的servlet,在此提交之前服务器会检查配置文件中是否有filter的拦截路径,

        如果拦截路径和请求中包含的路径匹配,比如拦截路径是:/*(拦截项目下的所有)

        服务器则会将请求和响应先递交给Filter,此时如果在Filter中调用请求对象的request.getPathInfo方法,将会出现如下情形:


    请求URL1 :    http://localhost/text/servlet/1
    请求URL2 :    http://localhost/text/sert/1
    请求URL3 :    http://localhost/text/servlet
    Filter路径 :  /*
    Servlet路径:  /servlet/*
    
    一、请求URL1
    
    URL1不是项目存在的实际目录,服务器提交往Servlet和Servlet互动,此时请求会被Filter拦截,当我们在
    Filter中调用请求对象的request.getPathInfo()方法时,会返回 1 ;
         

    二、请求URL2
    
    此时的URL2路径也会被提交往Servlet同时也被Filter拦截,我们在Filter中开始掉request.getPathInfo()方法,
    返回值将会是 null
    
    
    出现上述情况的根本原因在于,就算URL遭到了Filter的拦截,同时Filter也作用在Servlet之前,但当我们
    在Filter里面调用request的getPathInfo()方法时,方法的返回值本质还是返回请求URL相对于对应Servlet的
    路径的相对路径,类比情况一。要注意的是,当请求URL找不到与之对应得Servlet的时候,自然也就没有了相对
    的参考点,自然也就不存在着相对路径,返回值就会是Null,类比情况二。
    尽管是在Filter中调用请求对象的getPathInfo()方法也尽管Filter执行在Servlet前,但是该方法的返回值和
    Filter无关,也和Filter的路径无关。只和存不存在对应的Servlet有关。

    
    
    三、请求URL3
    提交请求URL3,此时有Servlet与之对应,能够进入Servlet,但是他们的地址目录一样,相对地址为空,所有
    getPathInfo()方法也返回Null;
    
    
    
    
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


@WebFilter("/*")
public class TestFilter implements Filter {

   
    public TestFilter() {
   
    }

    public void destroy() {
    
    }

    public void doFilter(ServletRequest request, ServletResponse response,
    FilterChain chain) throws IOException, ServletException {
        HttpServletRequest    req=(HttpServletRequest)request;
        HttpServletResponse resp=(HttpServletResponse)response;
        System.out.println("过滤器中的PathInfo:"+req.getPathInfo());
        chain.doFilter(req, resp);
    }

    
    public void init(FilterConfig fConfig) throws ServletException {
    
    }

}
    
    
    
    
    
import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(name="text",urlPatterns={"/servlet/*"})
public class TestServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
    throws ServletException, IOException {
    
        System.out.println("Servlet中的PathInfo:"+req.getPathInfo());
        
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
    throws ServletException, IOException {
        this.doGet(req, resp);
    }

}   


本人纯属菜鸟,这是我的第一篇博客,其中不足之处望大家多多指正       文章出自:危险同源

   

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值