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. 【BZOJ3444】最后的晚餐 乱搞

    [BZOJ3444]最后的晚餐 Description [问题背景] 高三的学长们就要离开学校,各奔东西了.某班n人在举行最后的离别晚餐时,饭店老板觉得十分纠结.因为有m名学生偷偷找他,要求和自己暗恋 ...

  2. JAVA的Hashtable在遍历时的迭代器线程问题

    这篇博客主要讲什么 Hashtable及其内部类的部分源码分析 Hashtable在遍历时的java.util.ConcurrentModificationException异常的来由和解决 单机在内 ...

  3. py 与 pyc 文件

    本文要说明的问题 pyc 文件是什么 pyc 文件的作用 py 与 pyc 文件冲突 pyc 文件是什么 当 py 文件加载后,py 文件被二进制编码成 pyc 文件.py 文件的修改时间被记录到 p ...

  4. 基于jquery 移动插件的实现

    引用谢灿勇 地址  http://www.cnblogs.com/st-leslie/p/6002148.html 一个思路分析:大致上实现的思路有以下两种. 一.判断块是否被按下(mousedown ...

  5. The C Programming Language Second Edition

    %12d  at least #include <stdio.h> main() { ,sum=,w=; ; ; w<=end; w++ ) { sum+=w; // for(wb= ...

  6. Bridged Adapter(网桥模式)

    http://www.jianshu.com/p/f59a0695b164 https://technology.amis.nl/2014/01/27/a-short-guide-to-network ...

  7. Centos7安装zookeeper

    1.进入/opt cd /opt 2.下载 zookeeper-3.4.10.tar.gz: wget https://mirrors.tuna.tsinghua.edu.cn/apache/zook ...

  8. 基于网页api(接口)实现查快递

    之前在网上找到一款下载某慕课网站的java版软件,我想知道他是怎么实现:对于视频的下载的,毕竟网页源码中大都不会直接放视频的地址,但是没有公布源码,我就反编译,等到了部分“源码”,逻辑上还是有些问题, ...

  9. JavaScript数据结构与算法-栈练习

    栈的实现 // 栈类 function Stack () { this.dataStore = []; this.top = 0; // 栈顶位置 相当于length,不是索引. this.push ...

  10. Bootstrap学习-其它内置组件

    1.缩略图(一) 缩略图在网站中最常用的地方就是产品列表页面,一行显示几张图片,有的在图片底下(左侧或右侧)带有标题.描述等信息.Bootstrap框架将这一部独立成一个模块组件.并通过“thumbn ...