当一个请求发生,比如说是 http://localhost/text/servlet/1则会产生在服务器中实例化一个request内置对象,
并且分析请求对象的路径的信息,比如该对象请求路径tmall/text/1不是实际存在的目录,
服务器则会将请求对象和响应对象提交给配置文件中的servlet,在此提交之前服务器会检查配置文件中是否有filter的拦截路径,
如果拦截路径和请求中包含的路径匹配,比如拦截路径是:/*(拦截项目下的所有)
服务器则会将请求和响应先递交给Filter,此时如果在Filter中调用请求对象的request.getPathInfo方法,将会出现如下情形:
请求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);
}
}
本人纯属菜鸟,这是我的第一篇博客,其中不足之处望大家多多指正 文章出自:危险同源