Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Web服务器的工作原理

Web服务器的工作原理

作者头像
用户1289394
发布于 2018-02-27 08:15:16
发布于 2018-02-27 08:15:16
2.2K00
代码可运行
举报
文章被收录于专栏:Java学习网Java学习网
运行总次数:0
代码可运行

Web服务器的工作原理

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(面向事务的中间件)、TopEndEncina等产品,这些产品都是从类似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的所有请求共享。这是非线程安全的!下面的例子说明了这个问题:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class MyServlet extends HttpServlet
{
    private Object thisIsNOTThreadSafe; //Don't to this

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        Object thisIsThreadSafe;

        thisIsNOTThreadSafe = request.getParameter("foo"); // BAD!! Shared among all requests!
        thisIsThreadSafe = request.getParameter("foo"); // OK, this is thread safe.
    }
}

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2015-09-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java学习网 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
走进JavaWeb技术世界4:Servlet 工作原理详解
本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看
Java技术江湖
2019/10/21
5710
Java Web 33道面试题
HTTP 协议有 HTTP/1.0 版本和 HTTP/1.1 版本。HTTP1.1 默认保持长连接(HTTP persistent connection,也翻译为持久连接),数据传输完成了保持 TCP 连接不断开(不发 RST 包、不四次握手),等待在同域名下继续用这个通道传输数据;相反的就是短连接。
小熊学Java
2023/10/23
3080
Java Web 33道面试题
不知道这些Servlet规范、容器,还敢说自己是Java程序员?
实现Web动态内容的技术,最早使用的是CGI(Common Gateway Interface,通用网关接口)技术,根据用户输入的请求动态地传送HTML数据。 CGI并不是开发语言,而只是能够利用为它编写的程序来实现Web服务器的一种协议。 可用来实现电子商务网站、搜索引擎处理和在线登记等功能。当用户在Web页面中提交输入的数据时,Web浏览器就会将用户输入的数据发送到Web服务器上。在服务器上,CGI程序对输入的数据进行格式化,并将这个信息发送给数据库或服务器上运行的其他程序,然后将结果返回给Web服务器。最后,Web服务器将结果发送给Web浏览器,这些结果有时使用新的Web页面显示,有时在当前Web页面中显示。
JavaEdge
2021/12/07
5100
不知道这些Servlet规范、容器,还敢说自己是Java程序员?
Java Web基础面试题整理
a、API:有一个接口servlet,它是servlet规范中定义的用来处理客户端请求的程序需要实现的顶级接口。
Java团长
2018/09/27
2.1K1
Java Web基础面试题整理
servlet/tomcat等容器/springMVC之间的关系
Servlet是JavaEE规范的一种,主要是为了扩展Java作为Web服务的功能,统一接口。由其他内部厂商如tomcat,jetty内部实现web的功能。如一个http请求到来: 容器将请求封装为servlet中的HttpServletRequest对象,调用init(),service()等方法输出response,由容器包装为httpresponse返回给客户端的过程。
Monica2333
2020/06/19
1.2K0
不知道这些Servlet规范、容器,还敢说自己是Java程序员?
浏览器发给服务端的是一个HTTP格式的请求,HTTP服务器收到这个请求后,需要调用服务端程序来处理。
JavaEdge
2021/10/18
1.2K0
程序员的20大JSP面试问题及答案
1.JSP与Java Servlet一样,是在服务器端执行的,通常返回该客户端的就是一个HTML文本,因此客户端只要有浏览器就能浏览
鱼找水需要时间
2023/12/23
2970
web服务器有哪些?_服务器和web服务器有什么区别
如果一个软件的主要部分采用了”网络服务”,即它把存储或计算环节”外包”给其他网站了,那么我们就说这个软件属于Web Service架构。
全栈程序员站长
2022/11/04
9.2K0
web服务器有哪些?_服务器和web服务器有什么区别
猿进化系列9——一文学会java web开发基础
昨天猿人工厂君像你安利了web开发的一些套路,其中最大的套路就算是思考了,因为猿人的一生都是一个不停思考的过程,你也可以回头再看看,顺藤摸瓜,学到很多知识噢。在快速进化变身为猿人的过程中,学会使用特定的工具,去解决特定场景的问题,也是一个快速进化的不二法宝。
山旮旯的胖子
2020/07/28
3800
猿进化系列9——一文学会java web开发基础
整理+学习《骆昊-Java面试题全集(中)》
答:Servlet与CGI的区别在于Servlet处于服务器进程中,它通过多线程方式运行其service()方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于Servlet。
黑泽君
2018/12/27
9820
整理+学习《骆昊-Java面试题全集(中)》
Java Web开发API Boy如何进阶?
导语 | Java Web后台开发基本都离不开Spring生态这一套,Spring框架功能极其强大,会帮忙做许多工作,我们通常只需要在一个函数(包含request和response两个入参)中写处理逻辑即可。但是想要真正写好工业级的Java Web应用,对于开发细节必须有更深入的了解,比如一个Http请求发过来之后,解析请求的代码在哪里,是不是Spring框架做的解析?写的业务逻辑代码没有main函数入口,是如何被调用执行的?开发中用到的Listerner,Filter,Interceptor到底是什
腾讯云开发者
2021/06/25
5670
web服务器有哪几种_web服务器的虚拟目录
当我们打开电脑,通过浏览器看到的网站,所有网站服务器多是我们所说的web服务器,具体解释就是一种驻留在Internet上的计算机程序,web服务器通过存储网站文件,放置大小不一各类数据文件,来进行工作,所以世界上每个角落多有它的身影。 我们常见的Web服务器协议有三种,1、HTTP协议,2、HTML文档格式,最后是浏览器统一资源定位器,也就是我们常见的URL。 第一种:IIS IIS是我们网站用的最普遍的web服务器,IIS允许在公共网络上或者普通网络上发布信息的服务器,使IIS成为使用最广的web服务器之一。我们经常使用的网站很多都是建立在IIS的平台上进行运营,得到很多用户信赖。其中这里说道的IIS指的是一种web服务组件,里面还包括了FTP服务器、NNTP服务器等等服务器,分别进行网页浏览、文件传输等功能,由于IIS的帮助,很多不懂程序的网站管理也能轻松管理网站。
全栈程序员站长
2022/11/04
1.4K0
web容器和web服务器区别关系_java中间件有哪些
我们经常会被Web服务器、Web容器和Web中间件这三个概念搞混。因为我们常见的很多网站要么是由IIS搭建,要么是由Apache、Tomcat、Ngnix搭建。所以,我们会把他们都叫成是Web服务器,因为他们都提供了Web服务,可以让我们通过http协议访问到。但是又有很多地方会说Tomcat是Servlet容器,而又有很多地方会说Tomcat是Web中间件!那么,他们到底是Web服务器还是容器,还是Web中间件呢???
全栈程序员站长
2022/11/16
1.6K0
Web服务器、应用程序服务器、HTTP服务器区别
WEB服务器、应用程序服务器、HTTP服务器有何区别?IIS、Apache、Tomcat、Weblogic、WebSphere 都各属于哪种服务器?这些问题困惑了很久,今天终于梳理清楚了:
哲洛不闹
2018/09/14
9.7K0
servlet/filter/listener/interceptor区别与联系
1、servlet:servlet是一种运行服务器端的java应用程序,具有独立于平台和协议的特性,并且可以动态的生成web页面,它工作在客户端请求与服务器响应的中间层。最早支持 Servlet 技术的是 JavaSoft 的 Java Web Server。此后,一些其它的基于 Java 的 Web Server 开始支持标准的 Servlet API。Servlet 的主要功能在于交互式地浏览和修改数据,生成动态 Web 内容。这个过程为:
会说话的丶猫
2020/08/06
8840
servlet/filter/listener/interceptor区别与联系
编程体系结构(07):JavaEE之Web开发
客户端/服务器(Client/Server)模式,既要编写服务器端程序,也要开发客户端程序,软件更新时需要同时更新客户端和服务器端,整体模式相比BS架构要复杂,但是安全性比较高。
知了一笑
2020/10/19
6550
编程体系结构(07):JavaEE之Web开发
经典Java面试题收集(二)
答:Servlet与CGI的区别在于Servlet处于服务器进程中,它通过多线程方式运行其service()方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于Servlet。
gnnngu
2018/03/15
2K0
经典Java面试题收集(二)
JSP/Servlet Web 学习笔记 DayFive
  (1)在Web容器初始化Servlet实例时,都会为这个Servlet准备一个唯一的ServletConfig实例(俗称Servlet配置对象)。
Rekent
2018/09/04
4310
java过滤器和监听器的区别[拦截器监听器过滤器执行顺序]
大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说java过滤器和监听器的区别[拦截器监听器过滤器执行顺序],希望能够帮助大家进步!!!
Java架构师必看
2022/03/08
5830
JavaWeb(一)之细说Servlet
前言   其实javaWeb的知识早就学过了,可是因为现在在搞大数据开发,所以web的知识都忘记了。准备开始慢慢的把Web的知识一点一点的回忆起来,多学一点没有关系,就怕到时候要用的话,什么都不会了。 一、Servlet概述 1.1、Servlet简介   Servlet 运行在服务端的Java小程序,是sun公司提供一套规范(接口),用来处理客户端请求、响应给浏览器的动态资源。但servlet的实质就是java代码,通过java的API 动态的向客户端输出内容。   Servlet是Java Web的三大
用户1195962
2018/01/18
6510
JavaWeb(一)之细说Servlet
相关推荐
走进JavaWeb技术世界4:Servlet 工作原理详解
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验