Web 相关概念

Web 资源

Web资源一般来说可以分为静态资源和动态资源:

  1. 静态资源:供人浏览内容不变的资源,比如 html 页面。

  2. 动态资源:供人浏览内容会根据不同的情况变化的资源,这些是由应用程序产生的。

静态 Web 开发技术:html

动态 Web 开发技术:JSP/Serv let ASP PHP

Web 应用程序

将一系列的 Web 资源整合在一起,对外提供服务,这就是 Web 应用程序。一个 Web 应用程序由静态资源和动态资源组成:HTML、CSS、JavaScript、JSP、Java、Jar 等等。

这些 Web 资源开发好之后,如果想要给其他人使用,则需要交给 Web 服务器管理资源的访问。

静态/动态

对于静态资源,客户端请求之后,Web 服务器会直接从存储有静态页面的磁盘里面读取文件内容,然后在发送给客户端。客户端的浏览器经过渲染分析,得到了最终的显示效果。

对于动态资源,客户端请求之后,Web 服务器回将请求交给 Web Container 容器处理,Web Container 经过分析请求之后,会根据请求和数据库里面的记录信息动态的拼接出来页面,然后把内容交给 Web 服务器,Web 服务器再将内容给客户端。

Web 服务器 / 容器

Web 服务器:Web Server, Web 服务器是指能为发出请求的浏览器提供文档的程序。服务器是一种被动程序,只有浏览器发出请求的时候才会响应。应用层使用的是 HTTP 协议。目前最主流的三个 Web 服务器是 Apache、Nginx 和 IIS。

Web 容器:Web Container,Web 容器是一种服务程序,是可以部署多个 Web 应用程序的环境,负责调用管理这些 Web 应用程序。

而我们使用的 Tomcat 既是一个 Web 服务器,也是一个 Web 容器。

Tomcat 基础

文件结构

Tomcat 的启动

方法一:运行 bin 目录下的 start.bat

方法二:CMD 在 bin 目录运行 catalina run

端口修改

在 config 的 server.xml 配置文件中修改 Connector。当 xml 文件修改之后,就必须重启 Tomcat 服务器,来重新获得配置信息。

虚拟目录映射和部署

  1. 将 Web 应用程序放到 Tomcat 里面的 webapps 文件夹里面,这样启动 Tomcat 之后就可以访问了 Web 应用程序的资源了。

  2. .\conf\server.xml 中的 <host></host> 之间插入路径和文件名之间的映射,但是因为修改了服务器的配置信息,所以需要重启 Tomcat 才可以生效:

1
<Context path="/浏览器路径名" docBase="Web 应用实际计算机地址"/>
  1. .\conf\Catalina\localhost 目录下面添加一个 XML 配置文件,文件名任意,里面加入路径和文件位置之间的映射,这种方式可以不用重启服务器:
1
<Context path="/浏览器路径名" docBase="Web 应用实际计算机地址"/>

虚拟主机

在 server.xml 配置文件中,可以看到一条默认的 host 配置:

1
2
<Host name="localhost"  appBase="webapps"
unpackWARs="true" autoDeploy="true">

这就是我们在访问服务器 http://localhost:8080/ 的时候,表示我们访问的主机的名字叫作 localhost ,它的页面服务放在 webapps 文件夹下面。

又因为 Tomcat 可以设置多个主机,比如 Xorex 主机,Yukino 主机等,来供人们去根据名字访问它们。所以这里的 Host 主机又被称为虚拟主机(因为一台服务器可以设置多个不同名字的主机,这些主机并不是真正的多个服务器构成的,而是由一台主机模拟出来的。)

那么就可以自己设置一台主机了,在配置信息里加入一条 Host,表示设置主机名称 Xorex。

1
2
<Host name="Xorex" appBase="XorexWebSite"
unpackWARs="true" autoDeploy="true">

然后将主机名称和主机的地址绑定起来,也就是域名绑定 IP,这里我们肯定没办法改 DNS 服务器的 域名-IP 绑定,就只能改自己电脑记录的 域名-IP 绑定信息了(浏览器查询域名对应 IP 是优先查看本地保存的,没有再去询问 DNS 根域名服务器),在 C:\Windows\System32\drivers\etc 这里面的 hosts 文件增加 域名-IP 绑定信息:

1
2
3
4
# localhost name resolution is handled within DNS itself.
# 127.0.0.1 localhost
# ::1 localhost
127.0.0.1 Xorex

这样就可以通过 http://Xorex:8080/ 这个网址解析到 http://127.0.0.1:8080 服务器(也就是本机)的 Xorex 虚拟主机里面(因为 http://Xorex:8080/ 指定访问主机名为 Xorex, http://localhost:8080 指定访问主机名为 localhost。)

Java Web 应用文件结构

1
2
3
4
5
6
7
8
9
10
11
JavaWeb文件夹
|
| --- HTML JSP CSS JS 可以被客户端直接访问的资源
|
| --- WEB-INF 目录
| |
| --- class 目录 (存放 Java 代码)
|
| --- lib (Java 运行所需要的 Jar 包)
|
| --- web.xml (Web应用的配置文件)

对于用户来说,除了 WEB-INF 以外的目录的资源都可以随意访问获取,但是对于 WEB-INF 里面的,只有服务器自己才能访问调用。

打包 Web 应用程序

当我们按照上面的文件结构开发好了一个 Web 应用程序之后,我们就可以把这个 Web 应用程序打包了。使用 jar -cf WebPackageName.war WebDirName 就可以将 WebDirName 文件夹里面的 Web 应用程序打包为 WebPackageName.war 了。

其中 -c 表示 create 创建 war 包,-f 表示 file 命名 war 文件名字。

拿到 war 包之后可以直接放到对应主机的 appBase 文件夹下面,当 Tomcat 服务器启动的时候,会自动解压 war 包,并运行其服务。

Tomcat 工作原理

先看看 Tomcat 的结构图:

当 Tomcat 的服务器启动以后,会首先读取 server.xml 文件来启动一个 Server 服务器,Server 又会启动一个 Service 服务,里面有多个 Connector 来等待和客户端进行连接,不同的 Connector 会连接不同的请求协议。Connector 接收到客户端发送过来的请求之后,会转移给 Engine,由 Engine 分析此请求所访问的 Host 虚拟主机,并将请求转发给对应的 Host 虚拟主机,然后经过解析返回所请求的 Web 应用 Context。

比如 server.xml 里面就有各种的配置信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?xml version='1.0' encoding='utf-8'?>
<Server port="8005" shutdown="SHUTDOWN">
<Service name="Catalina">
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
<Engine name="Catalina" defaultHost="localhost">
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t &quot;%r&quot; %s %b" />
</Host>
</Engine>
</Service>
</Server>

Https 连接

Https 连接是加密连接,首先服务器会发送给客户端一份公钥,然后客户端自己持有私钥。通过非对称加密进行密钥交换(交换过程即使被监听也无法被截获:交换密钥),使用非对称加密 + 证书是为了防止有人伪造服务器。然后客户端就能从服务器手里安全的拿到数据的加密密钥,从而保证整个传输过程中的数据安全。

那么如何给自己的服务器添加证书呢,使用命令:keytool -genkey -alias tomcat -keyalg RSA 然后设置一个密码,就会在 User 文件夹下面生成一个 .keystore 文件,这个就是证书了,复制到 Tomcat 的 conf/.keystore 里面,然后在 server.xml 里面添加一个使用 Https 连接的 Connector :

注意 KeystorePass 属性这里填写你生成证书的时候设置的密码。

1
2
3
4
<Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol"
maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS"
keystoreFile="conf/.keystore" keystorePass="Password"/>

然后访问的时候就可以用 https://localhost:8443 进行访问了因为浏览器没有我们的 CA 证书,所以会显示不安全。