Web服务器的工作原理

2015/02/12 | 分类: 技术架构 | 5 条评论 | 标签: SERVLET

分享到:47

本文由 ImportNew - 进林 翻译自 howtodoinjava 。欢迎加入翻译小组。转载请见文末要求。

Web 服务器工作原理概述

很多时候我们都想知道,web 容器或web 服务器(比如Tomcat 或者jboss )是怎样工作的?它们是怎样处理来自全世界的http 请求的?它们在幕后做了什么动作?Java Servlet API(例如ServletContext ,ServletRequest ,ServletResponse 和Session 这些类)在其中扮演了什么角色?这些都是web 应用开发者或者想成为web 应用开发者的人必须要知道的重要问题或概念。在这篇文章里,我将会尽量给出以上某些问题的答案。请集中精神!

文章章节:

∙ 什么是web 服务器、应用服务器和web 容器? 什么是Servlet ?他们有什么作用? 什么是ServletContext ?它由谁创建? ServletRequest 和ServletResponse 从哪里进入生命周期? 如何管理Session ?知道cookie 吗? 如何确保线程安全?

什么是web 服务器,应用服务器和web 容器?

我先讨论web 服务器和应用服务器。让我在用一句话大概讲讲:

“在过去它们是有区别的,但是这两个不同的分类慢慢地合并了,而如今在大多在情况下和使用中可以把它们看成一个整体。”

在Mosaic 浏览器(通常被认为是第一个图形化的web 浏览器)和超链接内容的初期,演变出了“web 服务器”的新概念,它通过

HTTP 协议来提供静态页面内容和图片服务。在那个时候,大多数内容都是静态的,并且HTTP 1.0只是一种传送文件的方式。但在不久后web 服务器提供了CGI 功能。这意味着我们可以为每个web 请求启动一个进程来产生动态内容。现在,HTTP 协议已经很成熟了并且web 服务器变得更加复杂,拥有了像缓存、安全和session 管理这些附加功能。随着技术的进一步成熟,我们从Kiva 和NetDynamics 学会了公司专属的基于Java 的服务器端技术。这些技术最终全都融入到我们今天依然在大多数应用开发里使用的JSP 中。

以上是关于web 服务器的。现在我们来讨论应用服务器。

在同一时期,应用服务器已经存在并发展很长一段时间了。一些公司为Unix 开发了Tuxedo (面向事务的中间件)、TopEnd 、Encina 等产品,这些产品都是从类似IMS 和CICS 的

主机应用管理和监控环境衍生而来的。大部分的这些产品都指定了“封闭的”

产品专用通信协议来互连胖客户机(“fat ” client) 和服务器。在90年代,这些传统的应用服务器产品开始嵌入HTTP 通信功能,刚开始要利用网关来实现。不久后它们之间的界线开始变得模糊了。 同时,web 服务器越来越成熟,可以处理更高的负载、更多的并发和拥有更好的特性;应用服务器开始添加越来越多的基于HTTP 的通信功能。所有的这些导致了web 服务器与应用服务器的界线变得更窄了。

目前,“应用服务器”和“web 服务器”之间的界线已经变得模糊不清了。但是人们还把这两个术语区分开来,作为强调使用。

当有人说到“web 服务器”时,你通常要把它认为是以HTTP 为核心、web UI为向导的应用。当有人说到“应用服务器”时,你可能想到“高负载、企业级特性、事务和队列、多通道通信(HTTP 和更多的协议)”。但现在提供这些需求的基本上都是同一个产品。

以上就是关于web 服务器和应用服务器的全部内容。现在我们来看看第三个术语,即web 容器。

在Java 方面,web 容器一般是指Servlet 容器。Servlet 容器是与Java Servlet交互的web 容器的组件。web 容器负责管理Servlet 的生命周期、把URL 映射到特定的Servlet 、确保URL 请求拥有正确的访问权限和更多类似的服务。综合来看,Servlet 容器就是用来运行你的Servlet 和维护它的生命周期的运行环境。

什么是Servlet ?他们有什么作用?

在Java 里,Servlet 使你能够编写根据请求动态生成内容的服务端组件。事实上,Servlet 是一个在javax.servlet 包里定义的接口。它为Servlet 的生命周期声明了三个基本方法——init()、service()和destroy()。每个Servlet 都要实现这些方法(在SDK 里定义或者用户定义)并在它们的生命周期的特定时间由服务器来调用这些方法。

类加载器通过懒加载(lazy-loading )或者预加载(eager loading)自动地把Servlet 类加载到容器里。每个请求都拥有自己的线程,而一个Servlet 对象可以同时为多个线程服务。当Servlet 对象不再被使用时,它就会被JVM 当做垃圾回收掉。

懒加载的Servlet

预加载的

Servlet

什么是

ServletContext ?它由谁创建?

当Servlet 容器启动时,它会部署并加载所有的web 应用。当web 应用被加载时,Servlet 容器会一次性为每个应用创建Servlet 上下文(ServletContext )并把它保存在内存里。Servlet 容器会处理web 应用的web.xml 文件,并且一次性创建在web.xml 里定义的Servlet 、Filter 和Listener ,同样也会把它们保存在内存里。当Servlet 容器关闭时,它会卸载所有的web 应用和ServletContext ,所有的Servlet 、Filter 和Listner 实例都会被销毁。

从Java 文档可知,ServletContext 定义了一组方法,Servlet 使用这些方法来与它的

Servlet 容器进行通信。例如,用来获取文件的MIME 类型、转发请求或者编写日志文件。在web 应用的部署文件(deployment descriptor)标明“分布式”的情况下,web 应用的每一个虚拟机都拥有一个上下文实例。在这种情况下,不能把Servlet 上下文当做共享全局信息的变量(因为它的信息已经不具有全局性了)。可以使用外部资源来代替,比如数据库。

ServletRequest 和ServletResponse 从哪里进入生命周期?

Servlet 容器包含在web 服务器中,web 服务器监听来自特定端口的HTTP 请求,这个端口通常是80。当客户端(使用web 浏览器的用户)发送一个HTTP 请求时,Servlet 容器会创建新的HttpServletRequest 和HttpServletResponse 对象,并且把它们传递给已经创建的Filter 和URL 模式与请求URL 匹配的Servlet 实例的方法,所有的这些都使用同一个线程。

request 对象提供了获取HTTP 请求的所有信息的入口,比如请求头和请求实体。response 对象提供了控制和发送HTTP 响应的便利方法,比如设置响应头和响应实体(通常是JSP 生成的HTML 内容)。当HTTP 响应被提交并结束后,request 和response 对象都会被销毁。

如何管理Session ?知道cookie 吗?

当客户端第一次访问web 应用或者第一次使用request.getSession()获取HttpSession 时,Servlet 容器会创建Session ,生成一个long 类型的唯一ID (你可以使用session.getId()获取它)并把它保存在服务器的内存里。Servlet 容器同样会在HTTP 响应里设置一个Cookie ,cookie 的名是JSESSIONID 并且cookie 的值是session 的唯一ID 。

根据HTTP cookie规范

(正规的web 浏览器和web 服务器必须遵守的约定),在cookie 的有效期间,客户端(web 浏览器)之后的请求都要把这个cookie 返回给服务器。Servlet 容器会利用带有名为JSESSIONID 的cookie 检测每一个到来的HTTP 请求头,并使用cookie 的值从服务器内容里获取相关的HttpSession 。

HttpSession 会一直存活着,除非超过一段时间没使用。你可以在web.xml 里设定这个时间段,默认时间段是30分钟。因此,如果客户端已经超过30分钟没有访问web 应用的话,Servlet 容器就会销毁Session 。之后的每一个请求,即使带有特定的cookie ,都再也不会访问到同一个Session 了。servletcontainer 会创建一个新的Session 。

现有的Session

新的Session

另外,在客户端的session cookie

拥有一个默认的存活时间,这个时间与浏览器的运行时间相同。因此,当用户关闭浏览器后(所有的标签或者窗口),客户端的Session 就会被销毁。重新打开浏览器后,与之前的Session 关联的cookie 就再也不会被发送出去了。再次使用request.getSession()会返回一个全新的HttpSession 并且使用一个全新的session ID 来设置cookie 。

如何确保线程安全?

你现在应该已经知道所有的请求都在共享Servlet 和Filter 。这是Java 的一个很棒的特性,它是多线程的并且不同的线程(即HTTP 请求)可以使用同一个实例。否则,对每一个请求都重新创建一个实体会耗费很多的资源。

你同样要知道,你不应该使用Servlet 或者Filter 的实例变量来存放任何的请求或者会话范围内的数据。这些数据会被其他Session 的所有请求共享。这是非线程安全的!下面的例子说明了这个问题:

1

2

3

4

5

6

7

8

9

10

11

12 public class MyServlet extends HttpServlet { private Object thisIsNOTThreadSafe; //Don't to this protected void doGet(HttpServletRequest request, HttpServletResponse resServletException, IOException { Object thisIsThreadSafe; thisIsNOTThreadSafe = request.getParameter("foo"); // BAD!! Shar thisIsThreadSafe = request.getParameter("foo"); // OK, this is t }

}

不要这样做,这会导致软件出bug 。

所有的话题已经讲完了。敬请期待更多的文章。建议使用电子邮件订阅来获取文章更新的通知。

学习愉快!!

2015/02/12 | 分类: 技术架构 | 5 条评论 | 标签: SERVLET

分享到:47

本文由 ImportNew - 进林 翻译自 howtodoinjava 。欢迎加入翻译小组。转载请见文末要求。

Web 服务器工作原理概述

很多时候我们都想知道,web 容器或web 服务器(比如Tomcat 或者jboss )是怎样工作的?它们是怎样处理来自全世界的http 请求的?它们在幕后做了什么动作?Java Servlet API(例如ServletContext ,ServletRequest ,ServletResponse 和Session 这些类)在其中扮演了什么角色?这些都是web 应用开发者或者想成为web 应用开发者的人必须要知道的重要问题或概念。在这篇文章里,我将会尽量给出以上某些问题的答案。请集中精神!

文章章节:

∙ 什么是web 服务器、应用服务器和web 容器? 什么是Servlet ?他们有什么作用? 什么是ServletContext ?它由谁创建? ServletRequest 和ServletResponse 从哪里进入生命周期? 如何管理Session ?知道cookie 吗? 如何确保线程安全?

什么是web 服务器,应用服务器和web 容器?

我先讨论web 服务器和应用服务器。让我在用一句话大概讲讲:

“在过去它们是有区别的,但是这两个不同的分类慢慢地合并了,而如今在大多在情况下和使用中可以把它们看成一个整体。”

在Mosaic 浏览器(通常被认为是第一个图形化的web 浏览器)和超链接内容的初期,演变出了“web 服务器”的新概念,它通过

HTTP 协议来提供静态页面内容和图片服务。在那个时候,大多数内容都是静态的,并且HTTP 1.0只是一种传送文件的方式。但在不久后web 服务器提供了CGI 功能。这意味着我们可以为每个web 请求启动一个进程来产生动态内容。现在,HTTP 协议已经很成熟了并且web 服务器变得更加复杂,拥有了像缓存、安全和session 管理这些附加功能。随着技术的进一步成熟,我们从Kiva 和NetDynamics 学会了公司专属的基于Java 的服务器端技术。这些技术最终全都融入到我们今天依然在大多数应用开发里使用的JSP 中。

以上是关于web 服务器的。现在我们来讨论应用服务器。

在同一时期,应用服务器已经存在并发展很长一段时间了。一些公司为Unix 开发了Tuxedo (面向事务的中间件)、TopEnd 、Encina 等产品,这些产品都是从类似IMS 和CICS 的

主机应用管理和监控环境衍生而来的。大部分的这些产品都指定了“封闭的”

产品专用通信协议来互连胖客户机(“fat ” client) 和服务器。在90年代,这些传统的应用服务器产品开始嵌入HTTP 通信功能,刚开始要利用网关来实现。不久后它们之间的界线开始变得模糊了。 同时,web 服务器越来越成熟,可以处理更高的负载、更多的并发和拥有更好的特性;应用服务器开始添加越来越多的基于HTTP 的通信功能。所有的这些导致了web 服务器与应用服务器的界线变得更窄了。

目前,“应用服务器”和“web 服务器”之间的界线已经变得模糊不清了。但是人们还把这两个术语区分开来,作为强调使用。

当有人说到“web 服务器”时,你通常要把它认为是以HTTP 为核心、web UI为向导的应用。当有人说到“应用服务器”时,你可能想到“高负载、企业级特性、事务和队列、多通道通信(HTTP 和更多的协议)”。但现在提供这些需求的基本上都是同一个产品。

以上就是关于web 服务器和应用服务器的全部内容。现在我们来看看第三个术语,即web 容器。

在Java 方面,web 容器一般是指Servlet 容器。Servlet 容器是与Java Servlet交互的web 容器的组件。web 容器负责管理Servlet 的生命周期、把URL 映射到特定的Servlet 、确保URL 请求拥有正确的访问权限和更多类似的服务。综合来看,Servlet 容器就是用来运行你的Servlet 和维护它的生命周期的运行环境。

什么是Servlet ?他们有什么作用?

在Java 里,Servlet 使你能够编写根据请求动态生成内容的服务端组件。事实上,Servlet 是一个在javax.servlet 包里定义的接口。它为Servlet 的生命周期声明了三个基本方法——init()、service()和destroy()。每个Servlet 都要实现这些方法(在SDK 里定义或者用户定义)并在它们的生命周期的特定时间由服务器来调用这些方法。

类加载器通过懒加载(lazy-loading )或者预加载(eager loading)自动地把Servlet 类加载到容器里。每个请求都拥有自己的线程,而一个Servlet 对象可以同时为多个线程服务。当Servlet 对象不再被使用时,它就会被JVM 当做垃圾回收掉。

懒加载的Servlet

预加载的

Servlet

什么是

ServletContext ?它由谁创建?

当Servlet 容器启动时,它会部署并加载所有的web 应用。当web 应用被加载时,Servlet 容器会一次性为每个应用创建Servlet 上下文(ServletContext )并把它保存在内存里。Servlet 容器会处理web 应用的web.xml 文件,并且一次性创建在web.xml 里定义的Servlet 、Filter 和Listener ,同样也会把它们保存在内存里。当Servlet 容器关闭时,它会卸载所有的web 应用和ServletContext ,所有的Servlet 、Filter 和Listner 实例都会被销毁。

从Java 文档可知,ServletContext 定义了一组方法,Servlet 使用这些方法来与它的

Servlet 容器进行通信。例如,用来获取文件的MIME 类型、转发请求或者编写日志文件。在web 应用的部署文件(deployment descriptor)标明“分布式”的情况下,web 应用的每一个虚拟机都拥有一个上下文实例。在这种情况下,不能把Servlet 上下文当做共享全局信息的变量(因为它的信息已经不具有全局性了)。可以使用外部资源来代替,比如数据库。

ServletRequest 和ServletResponse 从哪里进入生命周期?

Servlet 容器包含在web 服务器中,web 服务器监听来自特定端口的HTTP 请求,这个端口通常是80。当客户端(使用web 浏览器的用户)发送一个HTTP 请求时,Servlet 容器会创建新的HttpServletRequest 和HttpServletResponse 对象,并且把它们传递给已经创建的Filter 和URL 模式与请求URL 匹配的Servlet 实例的方法,所有的这些都使用同一个线程。

request 对象提供了获取HTTP 请求的所有信息的入口,比如请求头和请求实体。response 对象提供了控制和发送HTTP 响应的便利方法,比如设置响应头和响应实体(通常是JSP 生成的HTML 内容)。当HTTP 响应被提交并结束后,request 和response 对象都会被销毁。

如何管理Session ?知道cookie 吗?

当客户端第一次访问web 应用或者第一次使用request.getSession()获取HttpSession 时,Servlet 容器会创建Session ,生成一个long 类型的唯一ID (你可以使用session.getId()获取它)并把它保存在服务器的内存里。Servlet 容器同样会在HTTP 响应里设置一个Cookie ,cookie 的名是JSESSIONID 并且cookie 的值是session 的唯一ID 。

根据HTTP cookie规范

(正规的web 浏览器和web 服务器必须遵守的约定),在cookie 的有效期间,客户端(web 浏览器)之后的请求都要把这个cookie 返回给服务器。Servlet 容器会利用带有名为JSESSIONID 的cookie 检测每一个到来的HTTP 请求头,并使用cookie 的值从服务器内容里获取相关的HttpSession 。

HttpSession 会一直存活着,除非超过一段时间没使用。你可以在web.xml 里设定这个时间段,默认时间段是30分钟。因此,如果客户端已经超过30分钟没有访问web 应用的话,Servlet 容器就会销毁Session 。之后的每一个请求,即使带有特定的cookie ,都再也不会访问到同一个Session 了。servletcontainer 会创建一个新的Session 。

现有的Session

新的Session

另外,在客户端的session cookie

拥有一个默认的存活时间,这个时间与浏览器的运行时间相同。因此,当用户关闭浏览器后(所有的标签或者窗口),客户端的Session 就会被销毁。重新打开浏览器后,与之前的Session 关联的cookie 就再也不会被发送出去了。再次使用request.getSession()会返回一个全新的HttpSession 并且使用一个全新的session ID 来设置cookie 。

如何确保线程安全?

你现在应该已经知道所有的请求都在共享Servlet 和Filter 。这是Java 的一个很棒的特性,它是多线程的并且不同的线程(即HTTP 请求)可以使用同一个实例。否则,对每一个请求都重新创建一个实体会耗费很多的资源。

你同样要知道,你不应该使用Servlet 或者Filter 的实例变量来存放任何的请求或者会话范围内的数据。这些数据会被其他Session 的所有请求共享。这是非线程安全的!下面的例子说明了这个问题:

1

2

3

4

5

6

7

8

9

10

11

12 public class MyServlet extends HttpServlet { private Object thisIsNOTThreadSafe; //Don't to this protected void doGet(HttpServletRequest request, HttpServletResponse resServletException, IOException { Object thisIsThreadSafe; thisIsNOTThreadSafe = request.getParameter("foo"); // BAD!! Shar thisIsThreadSafe = request.getParameter("foo"); // OK, this is t }

}

不要这样做,这会导致软件出bug 。

所有的话题已经讲完了。敬请期待更多的文章。建议使用电子邮件订阅来获取文章更新的通知。

学习愉快!!


相关内容

  • 浏览器工作原理 3
  • WWW 的工作基于客户机/服务器计算模型,由Web 浏览器(客户机)和Web服务器(服务 器)构成,两者之间采用超文本传送协议(HTTP)进行通信, HTTP协议的作用原理包括四 个步骤:连接,请求,应答.根据上述HTTP协议的作用原理,本文实现了GET请求的Web服 务器程序的方法,通过创建 Tc ...

  • Cookie工作原理
  • Cookie工作原理 Cookies基础 Cookies是web站点放置到你的硬盘上的程序.它们驻留在你的计算机上收集关于你在因特网上所做的一切事情的信息,并且web站点可以在任何时候读取到Cookies收集到的所有信息. 在新闻中这样定义是公平的,问题是,这个定义中没有一个是正确的,Cookies ...

  • 国信蓝点杯课程-参加蓝点必看
  • 课 程 课程内容 Java基础 深入理解计算机系统,了解软件开发行业和软件 开发工作各种常用编程语言的认识.Java语言 的历史.特点.和用途. Java开发环境的搭建,包括操作系统初步培训目标 通过本部分内容的学习,掌握计算机的深入使用和对软件开发的深入认识和理解.掌握Java 编程中的基本语法规 ...

  • 2013计算机软件水平考试网络管理员级考试大纲
  • 一.考试说明 1.考试目标 本考试的合格人员能够进行小型网络系统的设计.构建.安装和调试,中小型局域网的运行维护和日常管理:根据应用部门的需求,构建和维护Web网站,进行网页制作:具有助理工程师(或技术员)的实际工作能力和业务水平. 2.考试要求 (1)熟悉计算机系统基础知识: (2)熟悉数据通信的 ...

  • 状态检测防火墙原理
  • 浅谈状态检测防火墙和应用层防火墙的原理(结合ISA SERVER) 防火墙发展到今天,虽然不断有新的技术产生,但从网络协议分层的角度,仍然可以归为以下三类: 1, 包过滤防火墙: 2, 基于状态检测技术(Stateful-inspection)的防火墙: 3, 应用层防火墙. 这三类防火墙都是向前包 ...

  • 信息组织与管理
  • 结课大作业 信息组织与管理 学 学 专 生生业姓学班名 号 级 汪厚连 08580101 08信息管理1班 管理工程系 2011年6月7日 目录 1 根据第三章,分别用800字.500字.200字和120字概括第三章内容 ......................... 1 1.1 800字概括 ...

  • 软考辅导:网络管理员必须掌握的知识
  • 网络管理员必须掌握的知识 第一部分:计算机结构及工作原理.各种零配件的性能参数及主流品牌.计算机硬件的组装,CMOS设置,硬盘的分区,格式化.Windows98/2000 /XP的安装.硬件驱动程序和应用程序的安装.Windows注册表的结构,备份及应用.Windows的内核:CPU.内存.硬盘等分 ...

  • 网络钓鱼攻击技术分析及防范
  • [ 目录 ] 0×00 网络钓鱼形势分析 0×01 网络钓鱼原理分析 0×02 URL编码结合钓鱼技术 0×03 Web漏洞结合钓鱼技术 0×04 伪造Email 地址结合钓鱼技术 0×05 浏览器漏洞结合钓鱼技术 0×06 如何防范网络钓鱼攻击 0×07 内容关键字匹配URL 检测钓鱼攻击 0×0 ...

  • 搜索引擎的历史现状和未来
  • 浙江大学软件学院2009<互联网搜索技术>系列课程之一搜索引擎的历史, 搜索引擎的历史,现状和未来张 勤Alibaba Search Center <互联网搜索技术>课程目标• • • • 加深对互联网和搜索引擎的理解 学习搜索引擎相关的核心技术领域 可以搭建一个简单的搜索引 ...