Tomcat
安装配置
win
官网下载压缩包,解压后就可以完成Tomcat的安装了。
bin目录下执行startup.bat脚本文件启动tomcat,浏览器访问localhost:8080
看到tom猫代表安装成功。
端口占用,黑窗口一闪而过,百度。
Linux
官网下载相应的安装包,一般将其放置/usr/opt目录下。
解压缩后,bin目录下执行./startup.sh
命令启动Tomcat。
Linxu下配置JAVA_HOME
vi /etc/profile
#添加
export JAVA_HOME=jdk安装目录
export PATH=$PATH:$JAVA_HOME/bin
如果是在虚拟机上安装的tomcat,如果想要在主机上访问,需要关闭虚拟机的防火墙或者开放端口。
# 开放端口
firewall-cmd --zone=public --add-port=8080/tcp --permanent
# 关闭防火墙
systemctl stop firewalld
云服务器上只需要在网络安全组开放端口即可。
Tomcat的启动依赖于
JAVA_HOME
这个环境变量,无论是Linux还是win,都应该正确配置。
Tocmat目录结构
虚拟目录映射
Web应用开发好后,若想供外界访问,需要把web应用所在目录交给web服务器管理,这个过程称之为虚似目录的映射。
1、修改server.xml
在server.xml文件中<Host></Host>
元素下添加<Context path="/webdemo" docBase="F:\ApachePackage\WebProj01"/>
即可将在F盘下的WebProj01这个JavaWeb应用映射到webdemo这个虚拟目录上,webdemo这个虚拟目录是由Tomcat服务器管理的,webdemo是一个硬盘上不存在的目录,是我们自己随便写的一个目录,也就是虚拟的一个目录,所以称之为"虚拟目录"。
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
<Context docBase="F:\ApachePackage\WebProj01" path="/webdemo" reloadable="true"/>
</Host>
Context表示上下文,代表的就是一个JavaWeb应用,Context元素有两个属性,
- path:用来配置虚似目录,必须以"/"开头。
- docBase:配置此虚似目录对应着硬盘上的Web应用所在目录。
注意:在Tomcat6之后中,不再建议在server.xml文件中使用配置context元素的方式来添加虚拟目录的映射,因为每次修改server.xml文件后,Tomcat服务器就必须要重新启动后才能重新加载server.xml文件。
2、tomcat服务器自动映射
tomcat服务器会自动管理webapps目录下的所有web应用,并把它映射成虚似目录。换句话说,tomcat服务器webapps目录中的web应用,外界可以直接访问。
比如,我们把一个web应用复制到webapps目录下,在没有修改配置文件前,我们可以直接根据文件名访问。
3、CATALINA目录下添加映射文档
参考Tomcat服务器文档
In individual files (with a “.xml” extension) in the
$CATALINA_BASE/conf/[enginename]/[hostname]/
directory. The context path and version will be derived from the base name of the file (the file name less the .xml extension). This file will always take precedence over any context.xml file packaged in the web application’s META-INF directory.
意思就是:在tomcat服务器的\conf\Catalina\localhost目录下添加一个以xml作为扩展名的文件,xml文件的名字可以任意取,比如下面的aa.xml,注意这一句话"The context path and version will be derived from the base name of the file",这一句话的意思翻译过来就是"context元素的path属性源自于是这个xml文件的名字",上面提到过,Context元素的path属性是用来配置虚似目录的名称的,所以虚似目录的名称就是这个xml文件的名称。
$CATALINA_BASE
指的就是tomcat服务器根目录,[enginename]
指的是Tomcat服务器使用的引擎名称,Tomcat使用的引擎是Catalina
示例:
在F:\ApachePackage\apache-tomcat-8.5.47\conf\Catalina\localhost
新建文档
文档内容为
<Context docBase="F:\ApachePackage\WebProj01"/>
配置完毕之后,不需要重启tomcat服务器,tomcat自动地会将webdemo映射到真是目录下,有点热加载的意思。
注:在xml文件的Context
标签中并没有path
属性,原因是虚似目录的名称就是这个xml文件的名称。
虚拟主机
配置虚似主机就是配置一个网站。
在Tomcat服务器配置一个虚拟主机(网站),需要修改conf文件夹下的server.xml这个配置文件,使用Host元素进行配置,打开server.xml,可以看到Tomcat服务器自带的一个名称为localhost的虚拟主机(网站),如下图所示:
平时我们将开发好的JavaWeb应用放到webapps文件夹下,然后就可以使用"http://localhost:端口号/webappname"的方式去访问了,其实访问的就是name是"localhost"的那台虚拟主机(Host),这台虚拟主机管理webapps文件夹下的所有web应用。
例如:http://localhost:8080/JavaWebDemoProject/1.jsp
,这个URL地址访问的就是名称是localhost的那台虚拟主机下的JavaWebDemoProject这个应用里面的1.jsp这个web资源。
配置虚拟主机,可以实现web站点下存在的多个应用,因为虚拟主机是通过Host元素配置,Host元素又可以定义Context上下文,同样支持配置多个虚拟路径。
配置虚拟主机
1、新增一个host结点信息
<Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true">
<!-- SingleSignOn valve, share authentication between web applications
Documentation at: /docs/config/valve.html -->
<!--
<Valve className="org.apache.catalina.authenticator.SingleSignOn" />
-->
<!-- Access log processes all example.
Documentation at: /docs/config/valve.html
Note: The pattern used is equivalent to using pattern="common" -->
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" pattern="%h %l %u %t "%r" %s %b" prefix="localhost_access_log" suffix=".txt"/>
</Host>
<Host appBase="F:\ApachePackage\temp" name="www.code.com" autoDeploy="true" unpackWARs="true">
然后在F:\ApachePackage\temp
下存放一个或者多个web项目,最简单的方式还可在temp
目录下新建
一个ROOT目录,然后新建一个index.html文件,之后在访问www.code.com:8080
站点时默认访问ROOT目录下的index.html文件。
2、host中的name值相当于域名,由于我们没有云服务器,没有IP也就没有域名,所以这里只是一个本地域名,要想能够被浏览器所访问,我们可以在本地host文件中做一下配置,让DNS解析该域名的结果定位到本机。
在C:\Windows\System32\drivers\etc
目录下的hosts文件下添加
127.0.0.1 www.code.com
win10下hosts文件没有找到
3、浏览器通过http://www.code.com:8080
访问测试
浏览器与服务器的交互过程
总的来说分为以下几个过程:
- DNS解析
- TCP连接
- HTTP请求
- 服务器处理请求并返回HTTP报文
- 浏览器解析渲染页面
- 连接关闭
Web程序目录结构
开发JavaWeb应用时,不同类型的文件有严格的存放规则,否则不仅可能会使web应用无法访问,还会导致web服务器启动报错
WebRoot →Web应用所在目录,一般情况下虚拟目录要配置到此文件夹当中。
WEB-INF:此文件夹必须位于WebRoot文件夹里面,而且必须以这样的形式去命名,字母都要大写。
web.xml:配置文件,有格式要求,此文件必须以这样的形式去命名,并且必须放置到WEB-INF文件夹中。
web.xml的格式可以直接从Tomcat中参考得到:找到Tomcat目录下的webapps\ROOT\WEB-INF这个目录下的web.xml文件。
Jar命令打包JavaWeb程序
# 打包命令和Linux压缩命令类似 相通的
jar -cvf 包名.war webapp
将打好的war包放入tomcat的webapp目录,tomcat自动地将war包解压缩并且部署。
验证一下,前面我已近配置过虚拟主机,按理说当前目录F:\ApachePackage\temp
相当于webapps目录,那么当tomcat启动时,会自动加载webapps目录和该目录,又因为war包能自动解压缩并部署,所以删去webdemo,然后重启tomcat查看是否会部署成功。
Idea中tomcat的运行原理
官网目录结构介绍有介绍到CATALINA_BASE
和CATALINA_HOME
,弄明白这两个元素的结构,然后可以参考下面这篇文章
Tomcat的体系结构
Tomcat服务器的启动是基于一个server.xml文件的,Tomcat启动的时候首先会启动一个Server,Server里面就会启动Service,Service里面就会启动多个"Connector(连接器)",每一个连接器都在等待客户机的连接,当有用户使用浏览器去访问服务器上面的web资源时,首先是连接到Connector(连接器),Connector(连接器)是不处理用户的请求的,而是将用户的请求交给一个Engine(引擎)去处理,Engine(引擎)接收到请求后就会解析用户想要访问的Host,然后将请求交给相应的Host,Host收到请求后就会解析出用户想要访问这个Host下面的哪一个Web应用,一个web应用对应一个Context。
<?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="8443" protocol="org.apache.coyote.http11.Http11Protocol"
maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS"
keystoreFile="conf/.keystore" keystorePass="123456"/>
<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 "%r" %s %b" />
</Host>
<Host name="www.gacl.cn" appBase="F:\JavaWebApps">
<Context path="" docBase="F:\JavaWebApps\JavaWebDemo1"/>
</Host>
</Engine>
</Service>
</Server>
互联网的加密原理
Tomcat服务器启动时候会启动多个Connector(连接器),而Tomcat服务器的连接器又分为加密连接器和非加密连机器,比如:
这里访问的就是使用8080端口的那个连接器
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
这个Connector是一个没有加密的连接器,使用"http://localhost:8080/JavaWebDemoProject/Web/1.jsp"去请求服务器上的web资源的这个过程中,我们的请求是不加密的,要是想以一种加密的方式来访问Tomcat服务器,那么就要在Tomcat里面配置一个加密的Connector。
对称加密
采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密。
需要对加密和解密使用相同密钥的加密算法。由于其速度快,对称性加密通常在消息发送方需要加密大量数据时使用。对称性加密也称为密钥加密。
所谓对称,就是采用这种加密方法的双方使用方式用同样的密钥进行加密和解密。密钥是控制加密及解密过程的指令。算法是一组规则,规定如何进行加密和解密。
加密的安全性不仅取决于加密算法本身,密钥管理的安全性更是重要。因为加密和解密都使用同一个密钥,如何把密钥安全地传递到解密者手上就成了必须要解决的问题。
常用的对称加密有:DES、IDEA、RC2、RC4、SKIPJACK、RC5、AES算法等
非对称加密
非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。 非对称加密算法实现机密信息交换的基本过程是:甲方生成一对密钥并将其中的一把作为公用密钥向其它方公开;得到该公用密钥的乙方使用该密钥对机密信息进行加密后再发送给甲方;甲方再用自己保存的另一把专用密钥对加密后的信息进行解密。另一方面,甲方可以使用乙方的公钥对机密信息进行签名后再发送给乙方;乙方再用自己的私匙对数据进行验签。
非对称加密工作原理
1.A要向B发送信息,A和B都要产生一对用于加密和解密的公钥和私钥。
2.A的私钥保密,A的公钥告诉B;B的私钥保密,B的公钥告诉A。
3.A要给B发送信息时,A用B的公钥加密信息,因为A知道B的公钥。
4.A将这个消息发给B(已经用B的公钥加密消息)。
5.B收到这个消息后,B用自己的私钥解密A的消息。其他所有收到这个报文的人都无法解密,因为只有B才有B的私钥
发送方使用接收方的公钥对数据加密,而接收方则使用自己的私钥解密,这样,信息就可以安全无误地到达目的地了,即使被第三方截获,由于没有相应的私钥,也无法进行解密。通过数字的手段保证加密过程是一个不可逆过程,即只有用私有密钥才能解密。
非对称性加密依然没有解决数据传输的安全性问题,比如A想向B发数据,B首先生成一对密钥(公钥和私钥),然后将公钥发给A,A拿到B发给他的公钥有就可以使用公钥加密数据后发给B,然而在B公钥发送给A的这个过程中,很有可能会被第三方C截获,C截获到B的公钥后,也使用B的公钥加密数据,然后发给B,B接收到数据后就晕了,因为搞不清楚接收到的数据到底是A发的还是C发的,这是其中一个问题,另一个问题就是,C截获到B发的公钥后,C可以自己生成一对密钥(公钥和私钥),然后发给A,A拿到公钥后就以为是B发给他的,然后就使用公钥加密数据发给B,发送给B的过程中被C截获下来,由于A是用C发给他的公钥加密数据的,而C有私钥,因此就可以解密A加密过后的内容了,而B接收到A发给他的数据后反而解不开了,因为数据是用C的公钥加密的,B没有C的私钥,所以就无法解密。所以,非对称性加密存在一个问题:A想向B发数据,A如何确定拿到的公钥一定是B发的呢?那么如何解决这个问题呢?只能靠一个第三方机构(CA机构,即证书授权中心(Certificate Authority ),或称证书授权机构)来担保。A想向B发数据,B首先将公钥发给CA机构,CA机构拿到B的公钥后跑到B的家里问:这是你发的公钥吗?B确认过后说是:没错,是我发的!那么此时CA机构就会为B的公钥做担保,生成一份数字证书给B,数字证书包含了CA的担保认证签名和B的公钥,B拿到CA的这份数字证书后,就发给A,A拿到数字证书后,看到上面有CA的签名,就可以确定当前拿到的公钥是B发的,那么就可以放心大胆地使用公钥加密数据,然后发给B了。
配置HTTPS连接器
注:
-
关于Connector port=8443的接口有多个实现,如果选择了
Http11AprProtocol
实现,则必须要有APR相关的jar,否则tomcat在启动的时候就会报错。 -
配置完毕之后注意访问的形式,是以**
https
**为前缀的网址进行访问。