web容器调用Filter和Servlet顺序学习

 一直对Filter和Servlet在哪里被web容器调用迷惑,后查看tomcat源码,揭开了其面纱。
1. 下面是一个简单的时序图:

2. 对上面时序图中用到的主要类进行分析

1)         ApplicationFilterChain类,有两个主要函数,下面是省略过会的代码

public voiddoFilter(request, response) {//暴露在外面的调用接口

if( Globals.IS_SECURITY_ENABLED ) {

finalServletRequest req = request;

finalServletResponse res = response;

internalDoFilter(req,res);

return null;

} else {

internalDoFilter(request,response);

}

}

private voidinternalDoFilter(request, response) {

if (pos < n) {//判断是否还有filter需要执行

ApplicationFilterConfig filterConfig = filters[pos++];

Filter filter = null;

filter = filterConfig.getFilter();

filter.doFilter(request, response, this);

return ;

}

{//filter执行完后,执行servlet

if ((request instanceofHttpServletRequest) &&

(response instanceof HttpServletResponse)) {

servlet.service((HttpServletRequest) request,

(HttpServletResponse) response);

}

}

void addFilter(ApplicationFilterConfig filterConfig) {

if (n == filters.length) {

ApplicationFilterConfig[] newFilters =

new ApplicationFilterConfig[n + INCREMENT];

System.arraycopy(filters, 0, newFilters, 0, n);

filters = newFilters;

}

filters[n++] = filterConfig;

}

2)         Servlet类的主要方法,以HttpServlet类为例,其主要方法是service(Request,Response)

public voidservice(ServletRequest req, ServletResponse res)

throws ServletException, IOException {

HttpServletRequest  request;

HttpServletResponse response;

try {

request = (HttpServletRequest) req;

response = (HttpServletResponse) res;

catch (ClassCastException e) {

throw new ServletException("non-HTTP request or response");

}

service(request, response);//内部的方法

}

protected voidservice(HttpServletRequest , HttpServletResponse)

throws ServletException, IOException {

String method = req.getMethod();

if (method.equals(METHOD_GET)) {

long lastModified = getLastModified(req);

if (lastModified == -1) {

doGet(req, resp); //常用的方法

else {

long ifModifiedSince;

try {

ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE);

catch (IllegalArgumentException iae) {

ifModifiedSince = -1;

}

if (ifModifiedSince < (lastModified / 1000 * 1000)) {

maybeSetLastModified(resp, lastModified);

doGet(req, resp);

else {

resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED);

}

}

else if (method.equals(METHOD_HEAD)) {

long lastModified = getLastModified(req);

maybeSetLastModified(resp, lastModified);

doHead(req, resp);

else if (method.equals(METHOD_POST)) {

doPost(req, resp);//常用的方法

else if (method.equals(METHOD_PUT)) {

doPut(req, resp);

else if (method.equals(METHOD_DELETE)) {

doDelete(req, resp);

else if (method.equals(METHOD_OPTIONS)) {

doOptions(req,resp);

else if (method.equals(METHOD_TRACE)) {

doTrace(req,resp);

else {

String errMsg =lStrings.getString("http.method_not_implemented");

Object[] errArgs = new Object[1];

errArgs[0] = method;

errMsg = MessageFormat.format(errMsg, errArgs);

resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg);

web容器调用Filter和Servlet顺序学习的更多相关文章

  1. 深入刨析tomcat 之---第23篇 聊一下web容器的filter配置和defaultservet

    writedby 张艳涛,在一个webapp应用程序内如何配置filter? <?xml version="1.0" encoding="ISO-8859-1&qu ...

  2. servlet入门学习之Web容器

    一.web服务器 web服务器(程序/软件) 即:www服务器或http服务器.提供Web信息浏览服务.它只需支持HTTP协议.HTML文档格式及URL.向浏览器提供服务的程序. 1.Web服务器是指 ...

  3. Javaweb里面的filter,listener,servlet

    Filter 1Filter是什么:是过滤器简称 2Filter有什么作用:在filter中可以得到代表用户请求和响应的request.response对象,因此在编程中可以使用Decorator(装 ...

  4. Introducation of Servlet filter(servlet过滤器介绍 )

    本文章向大家介绍Servlet Filter,主要包括 Servlet Filter使用实例.应用技巧.基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下. 过滤器是一个可以转换 ...

  5. filter in Servlet

    Servlet过滤器: Servlet过滤器是用于执行某些过滤任务的对象.过滤器可以应用于servlet,jsp或html. Servlet过滤器主要用于以下任务: 预处理: Servlet过滤器用于 ...

  6. 【转载并整理】filter、servlet、interceptor、listener区别

    参考文章:https://blog.csdn.net/u013087513/article/details/56835894 一.servlet servlet是一种运行服务器端的java应用程序,具 ...

  7. Spring Cloud Gateway 不小心换了个 Web 容器就不能用了,我 TM 人傻了

    个人创作公约:本人声明创作的所有文章皆为自己原创,如果有参考任何文章的地方,会标注出来,如果有疏漏,欢迎大家批判.如果大家发现网上有抄袭本文章的,欢迎举报,并且积极向这个 github 仓库 提交 i ...

  8. Web开发中Listener、Filter、Servlet的初始化及调用

    我们在使用Spring+SpringMVC开发项目中,web.xml中一般的配置如下: <?xml version="1.0" encoding="UTF-8&qu ...

  9. httpServletRequest对象、filter、servlet、servlet容器、catalina、tomcat、以及web容器之间的关系

    学习servlet的时候经常感到疑惑 HttpServletRequest是服务器创建的?还是servlet容器创建的? 过滤器是服务器创建的?还是servlet容器创建的? serlet容器和tom ...

随机推荐

  1. iphone断点下载,断点续传

    本文转载至 http://blog.csdn.net/zaitianaoxiang/article/details/6650469 - (void)loadView { NSURLConnection ...

  2. python MD5操作

    def my_md5(str): import hashlib new_str = str.encode() #把字符串转成bytes类型 # new_str = b'%s'%str #把字符串转成b ...

  3. git database 数据库 平面文件

    w 各个分支  git init 数据库 master分支 git 数据库 “分布式 地位平等的 ”  “git 区别与svn,没有 c/s 主从的概念”“”“c/s” 大家都往这个分支提交,这个分支 ...

  4. <2013 10 18> Linux随机数生成器可能确实存在安全弱点

    生成随机数是密码学中的一项基本任务,是生成加密密钥和加密算法或加密协议所必不可少的.理想中的随机数是完美的,但实践中的随机数都是用伪随机数生成器(PRNG)生成,随机数的质量对安全性至关重要.安全专家 ...

  5. C++常备知识总结

    1.extern表示是外部函数或外部变量,比如: 1.extern void add(int x,inty);表示该函数主体不在当前模块中,在另一个模块中(文件)2.extern int total; ...

  6. 【转】Mysql之binlog日志说明及利用binlog日志恢复数据操作记录

    众所周知,binlog日志对于mysql数据库来说是十分重要的.在数据丢失的紧急情况下,我们往往会想到用binlog日志功能进行数据恢复(定时全备份+binlog日志恢复增量数据部分),化险为夷! 废 ...

  7. python 时间模块小结

    python有两个重要的时间模块,分别是time和datetime time模块 表示时间的几种方法 时间元组 time.struct_time( tm_year=2016, tm_mon=7, tm ...

  8. window7系统下安装scrapy爬虫框架

    本文是在python3.6环境下安装的下面软件,如果大家和我的python版本不一致,请在页面选择符合自己版本的软件下载. 1.wheel pip install wheel 2.lxml 下载lxm ...

  9. Apache JServ Protocol (AJP)

    The Apache JServ Protocol (AJP) is a binary protocol that can proxy inbound requests from a web serv ...

  10. 两个div同时滚动

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...