当前位置: 首页 > news >正文

Tomcat的基础使用

目录

一、概念

1.1 概念

1.2 核心能力

1.3 Tomcat的限制

1.4 核心组件

1.5 请求处理流程(简化)

二、基本操作

2.1 下载与安装

2.2 启动与停止

2.3 访问测试

2.4 部署应用

三、目录结构与核心配置文件

3.1 目录结构

3.2 核心配置文件

3.2.1 conf/server.xml

3.2.2 conf/web.xml

3.2.3 conf/context.xml

3.2.4 conf/tomcat-users.xml


一、概念

1.1 概念

Tomcat 是一个 Web 容器(Web Container),更精确地说,它主要是一个 Servlet 容器(Servlet Container)。它实现了 Java Servlet、JSP(JavaServer Pages)、WebSocket 等规范。

  • Web 应用服务器 (Web Server):它能处理 HTTP 请求,将静态内容(如 HTML、图片)返回给客户端(如浏览器)。在这方面,它类似于 Nginx 或 Apache HTTP Server,但能力远不止于此。

  • Servlet 容器 (Servlet Container):这是它的核心身份。它实现了 Java Servlet、JSP (JavaServer Pages) 和 EL (Expression Language) 等 Java EE(现 Jakarta EE)规范。它的主要工作是管理和执行编写的 Servlet 和 JSP 程序。核心职责:

    • 生命周期管理:负责创建、初始化、调用服务和最终销毁Servlet实例。你不用自己写main方法来启动它,容器会处理这一切。

    • 网络通信:监听一个网络端口(通常是8080),处理进来的HTTP请求(请求行、请求头、请求体等),并将这些请求封装成标准的Java对象(HttpServletRequest)。

    • 会话管理:自动为不同的用户创建和管理会话(HttpSession),例如使用Cookie或URL重写来跟踪用户状态。

    • 资源管理:提供了一种统一的方式來读取Web应用的文件(如配置文件、图片等),通常通过ServletContext对象。

    • 将响应返回给客户端:获取你的Servlet代码生成的响应(写入HttpServletResponse对象),并将其格式化成正确的HTTP响应报文,发送回浏览器。

因此,Tomcat 更像是一个 “Java Web 应用运行时环境”,专门用来运行用 Java 技术栈(Servlet/JSP)开发的 Web 应用程序。

1.2 核心能力

  • 处理 HTTP 请求:Tomcat 监听端口(默认8080),接收、解析HTTP请求,并将请求交给对应的Servlet处理。

  • Servlet/JSP 生命周期管理:负责加载、初始化、执行和销毁 Servlet 和 JSP 文件。

  • 会话(Session)管理:提供HTTP会话管理机制,如通过Cookie或URL重写来跟踪用户会话状态。

  • 安全性:支持基于配置文件的认证和授权(如基本认证、表单认证)。

  • 静态资源服务:可以像普通Web服务器一样提供HTML、图片、CSS、JS等静态文件。

  • 轻量级与易用性:部署简单,启动快速,资源占用相对较小,是开发和部署中小型Web应用的首选。

1.3 Tomcat的限制

Tomcat 的边界就在于它 仅仅 是一个 Web 容器,而不是一个 完整的 Java EE(现 Jakarta EE)应用服务器。这意味着它缺少对很多企业级功能的原生支持:

  • 不支持 EJB(核心限制):这是最关键的一点。Tomcat 不能 运行 EJB(Enterprise JavaBeans)。EJB 需要的是一个 EJB 容器,而 Tomcat 没有内置这个容器。

EJB(Enterprise JavaBeans) 是 Java EE(Jakarta EE)平台中用于开发分布式、事务性、可扩展且安全的服务器端业务组件的标准架构。EJB 旨在将开发者从编写处理事务、安全性、并发、远程访问等底层基础设施代码中解放出来。开发者只需专注于业务逻辑,而由 EJB 容器(运行在应用服务器内)来提供这些复杂的“企业级”服务。

  • 有限的支持服务

    • JMS(Java Message Service):Tomcat 不提供原生的JMS消息代理功能。你需要集成外部消息中间件(如 ActiveMQ、RabbitMQ)并手动管理连接工厂等资源。

    • JTA(Java Transaction API):Tomcat 没有内置的全局事务管理器。它支持本地事务(如JDBC事务),但如果你需要管理跨多个数据库或资源(如数据库+消息队列)的分布式事务,则需要集成第三方JTA实现(如 Bitronix, Atomikos),配置复杂。

    • JCA(Java EE Connector Architecture):不支持连接企业信息系统(EIS)的标准架构。

    • 完整的JPA persistence:虽然可以通过集成Hibernate等ORM框架来使用JPA,但Tomcat本身不提供容器管理持久化(CMP)等高级功能。

  • 管理和监控工具相对简单:相比WebLogic、WebSphere等全功能应用服务器,Tomcat提供的管理和监控功能(如JMX)较为基础。

Tomcat 非常适合基于 Servlet/JSP 的 Web 应用程序。 如果你的应用主要是处理HTTP请求、展示页面、使用Spring/Spring Boot等轻量级框架(它们自己提供了事务管理、依赖注入等功能来弥补Tomcat的不足),那么Tomcat是完美选择。

但是, 如果你的应用需要完整的、开箱即用的企业级功能,如EJB、分布式事务、JMS消息队列,那么你需要一个功能完整的应用服务器(如 WildFly, JBoss EAP, IBM WebSphere, Oracle WebLogic)。

1.4 核心组件

这些组件都在 conf/server.xml 文件中进行配置。

  • Server:代表整个 Tomcat 实例(一个 JVM 进程)。它是顶级元素。Server包含多个Service。

  • Service:一个 Service 包含一个 Connector 和一个 Engine,将它们组合在一起提供服务。

    • Connector (连接器):负责接收外部请求。最常用的是:

      • HTTP/1.1 Connector:默认监听 8080 端口,处理 HTTP 请求。

      • AJP Connector:监听 8009 端口,使用 AJP 协议与前面的 Web 服务器(如 Apache HTTPD)通信,通常用于集成和负载均衡。

      • 每个 Connector 都会创建一个请求队列,并管理一个线程池来处理连接。

    • Engine (引擎):是一个请求处理管道,代表整个 Servlet 引擎。它接收来自 Connector 的请求,进行解析后,将其匹配并分发到正确的 Host

    • Host (虚拟主机):代表一个虚拟主机,允许在同一 Tomcat 实例上部署多个不同域名的应用(如 app1.com 和 app2.com)。默认的 Host 是 localhost

    • Context (上下文):这是最重要的概念之一,一个 Context 对应一个 Web 应用程序(一个 .war 文件或一个包含项目结构的目录)。它配置了应用的路径、资源等。

核心功能模块的别名:

  • Catalina:Tomcat 的 Servlet 容器 的实现名称。它包含了上述的 Engine, Host, Context 等组件。当我们说 “Tomcat 作为一个 Servlet 容器” 时,指的就是 Catalina。负责解析Tomcat的配置文件server.xml,以此来创建服务器Server组件并进行管理。

  • Coyote:Tomcat 的 HTTP 连接器 的实现名称。它负责以 HTTP 协议与客户端通信。

  • Jasper:Tomcat 的 JSP 引擎。它负责将 JSP 文件编译成对应的 Java Servlet 源码(.java),然后再编译成字节码(.class)并加载执行。

  • Cluster:提供会话复制和集群功能,用于实现高可用和负载均衡。

1.5 请求处理流程(简化)

浏览器 HTTP 请求 -> Coyote (监听 8080) -> Catalina Engine -> 匹配 Host -> 匹配 Context (/yourApp) -> 根据 web.xml 匹配 Servlet -> 执行您的业务代码 -> 返回响应 -> 浏览器

二、基本操作

2.1 下载与安装

官网下载:https://tomcat.apache.org/

解压即用,无需安装。需要系统有 JDK。

2.2 启动与停止

  • Linux/Mac: ./bin/startup.sh 和 ./bin/shutdown.sh

  • Windows: bin\startup.bat 和 bin\shutdown.bat

2.3 访问测试

启动后,在浏览器访问 http://localhost:8080,即可看到 Tomcat 的欢迎页面。

2.4 部署应用

  • 最简单方式:将打包好的 your-app.war 文件复制到 webapps/ 目录下,Tomcat 会自动解压并部署。应用上下文路径通常是 /your-app(不含 .war 后缀)。

  • 修改配置:在 conf/server.xml 中配置 <Context> 元素,或是在 conf/Catalina/localhost/ 下创建独立的 XML 文件来定义应用路径和位置。

三、目录结构与核心配置文件

3.1 目录结构

目录/文件类型主要功能与核心文件说明
bin/目录二进制脚本目录:包含所有启动、停止和其他管理Tomcat服务器的脚本和可执行文件。
文件startup.bat / startup.shWindows/Linux 下的启动脚本。
文件shutdown.bat / shutdown.shWindows/Linux 下的停止脚本。
文件catalina.bat / catalina.sh核心控制脚本,被上述脚本调用。
文件setenv.bat / setenv.sh(需自建)用于设置自定义环境变量(如JVM参数)。需要设置JVM参数(如内存设置 -Xms-Xmx)时,应创建 bin/setenv.sh(或 setenv.bat)文件,而不是直接修改 catalina.sh,以便于升级和维护。
conf/目录配置文件目录:包含Tomcat的全局配置文件,修改后通常需要重启才能生效。在修改 conf/ 目录下的任何文件前,最好先进行备份。
文件server.xml主配置文件。可修改服务器端口、配置虚拟主机、连接器等。
文件web.xml所有Web应用的默认部署描述符。配置默认会话超时、MIME类型等。
文件context.xml所有Web应用的默认上下文配置。常用于配置全局数据源等JNDI资源。
文件tomcat-users.xml用户认证文件。配置访问Manager和Host Manager应用的用户和角色。
文件catalina.policyJava安全策略文件,配置Tomcat以安全模式运行时的权限。
lib/目录共享库目录:存放Tomcat服务器运行所需及所有Web应用可访问的JAR文件(如Servlet API)。
说明通常将数据库驱动等通用JAR包放在此处,但应用自身的库应放在其 WEB-INF/lib 中。
logs/目录日志文件目录:存放Tomcat运行时生成的各种日志文件,是排查故障的首要位置
文件catalina.out / catalina.{date}.log主要的应用日志,包含未捕获的异常和System.out/err输出。遇到问题时,首先查看这个文件
文件localhost_access_log.{date}.txtHTTP访问日志,记录所有HTTP请求的详细信息。
文件localhost.{date}.logTomcat内部引擎日志。
webapps/目录Web应用部署目录最核心的目录,用于存放需要部署的Web应用程序(WAR包或解压后的文件夹)。生产环境中,应及时删除或禁用 webapps/ 下的 docsexamples 等示例应用,并为 manager 应用配置强密码。
说明部署方式:1. 将WAR包复制到此目录。 2. 将符合WAR结构的文件夹复制到此目录。
文件夹ROOT/根应用。访问 http://localhost:8080/ 时显示的内容。
文件夹manager/ / host-manager/用于管理和监控Tomcat的Web控制台应用。
work/目录工作目录:存放Tomcat运行时的临时文件,例如JSP编译后生成的Java源文件和Class文件。
说明清空此目录可强制Tomcat重新编译JSP,常用于解决JSP缓存引起的疑难问题。
temp/目录临时文件目录:被JVM用于存放应用程序运行过程中产生的临时文件(如文件上传的临时文件)。

可以把Tomcat想象成一个预装好的房子

  • bin/ - 大门和电闸:从这里进出(启动/停止)。

  • conf/ - 房子的总设计蓝图:决定了房子的结构、规则和配置。

  • lib/ - 共享的工具库:所有房间都可以使用的公共工具。

  • logs/ - 监控录像和日志:记录房子里发生的一切。

  • webapps/ - 一个个房间:你自己装修布置的地方(部署你的Web应用)。

  • work/ - 每个房间的装修工作间:存放装修时用的临时材料和图纸(JSP编译文件)。

  • temp/ - 公共垃圾桶:存放临时垃圾,会被定期清理。

3.2 核心配置文件

配置文件主要作用修改频率生产环境建议
server.xml定义服务器架构、连接器、虚拟主机。仔细规划端口和虚拟主机。启用访问日志(AccessLogValve)。
web.xml为所有应用设置默认值(会话超时、MIME类型等)。极低通常保持默认即可,特定设置应在应用自身的 web.xml 中配置。
context.xml配置所有应用共享的资源和全局设置(如JNDI数据源)。集中管理数据库连接池等资源的理想位置。
tomcat-users.xml管理用户认证和授权,用于访问管理控制台。务必修改默认密码! 删除或注释掉默认示例用户。严格分配角色。

3.2.1 conf/server.xml

server.xml:主配置文件,决定 Tomcat 的整体结构和组件。

Tomcat 的组件是分层嵌套的,理解这个层次关系是看懂 server.xml 的关键。基本结构如下:

Server → Service → Connector(s) & Engine → Host → Context

  • Server: 代表整个 Tomcat 实例(一个 JVM 进程),是顶级组件。

  • Service: 将一个或多个 Connector 与一个 Engine 绑定在一起,组成一个完整的服务单元。

  • Connector: 处理外部客户端的连接和通信(如 HTTP, AJP)。

  • Engine: 处理所有来自 Connector 的请求,是请求处理的入口。

  • Host: 代表一个虚拟主机,用于将请求映射到特定的 Web 应用(Context)。

  • Context: 代表一个独立的 Web 应用程序。

server.xml示例:

<?xml version='1.0' encoding='utf-8'?>
<Server port="8005" shutdown="SHUTDOWN"><Listener className="org.apache.catalina.startup.VersionLoggerListener" /><Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" /><Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" /><Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" /><Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" /><GlobalNamingResources><Resource name="UserDatabase" auth="Container"type="org.apache.catalina.UserDatabase"description="User database that can be updated and saved"factory="org.apache.catalina.users.MemoryUserDatabaseFactory"pathname="conf/tomcat-users.xml" /></GlobalNamingResources><Service name="Catalina"><!-- ==================== 线程池配置 (可选) ==================== --><Executor name="tomcatThreadPool" namePrefix="catalina-exec-"maxThreads="200" minSpareThreads="10"maxQueueSize="100" prestartminSpareThreads="true"/><!-- ==================== HTTP 连接器 (NIO) ==================== --><Connector executor="tomcatThreadPool"port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"connectionTimeout="20000"redirectPort="8443"maxConnections="10000"acceptCount="100"compression="on" compressionMinSize="1024" compressableMimeType="text/html,text/xml,text/css,text/javascript,application/json"enableLookups="false" URIEncoding="UTF-8"server="Unknown" /><!-- ==================== AJP 连接器 (通常用于集成前端Web服务器如Apache HTTPD或Nginx) ==================== --><!-- 生产环境中若Tomcat直接对外,或使用Nginx反向代理(通常用HTTP代理而非AJP),可考虑注释或删除AJP连接器 --><!--<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" secretRequired="true" secret="YourStrongAJPSecret" />--><!-- ==================== SSL/TLS 连接器 (HTTPS) ==================== --><Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"maxThreads="150" SSLEnabled="true"scheme="https" secure="true"><SSLHostConfig certificateVerification="false" protocols="TLSv1.2,TLSv1.3"><Certificate certificateKeystoreFile="conf/keystore.jks"certificateKeystorePassword="changeit" type="RSA" /></SSLHostConfig></Connector><Engine name="Catalina" defaultHost="localhost"><Realm className="org.apache.catalina.realm.LockOutRealm"><Realm className="org.apache.catalina.realm.UserDatabaseRealm"resourceName="UserDatabase" /></Realm><Host name="localhost"  appBase="webapps"unpackWARs="true" autoDeploy="false" deployOnStartup="true" deployIgnore=".*\.svn/.*"><!-- ==================== 访问日志 Valve ==================== --><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 %D" rotatable="true" /><!-- ==================== 远程IP Valve (如果你在Tomcat前使用了反向代理,如Nginx) ==================== --><!--<Valve className="org.apache.catalina.valves.RemoteIpValve"internalProxies="192\.168\.\d{1,3}\.\d{1,3}|10\.\d{1,3}\.\d{1,3}\.\d{1,3}"remoteIpHeader="x-forwarded-for"proxiesHeader="x-forwarded-by"protocolHeader="x-forwarded-proto" />--></Host></Engine></Service>
</Server>

按以上分层讲解标签:

组件/元素 (Element)关键属性 (Key Attributes)作用与描述
<Server>port指定 Tomcat 监听 shutdown 命令的端口。用于通过 CATALINA_HOME/bin/shutdown.sh 脚本安全关闭 Tomcat。
shutdown指定发送到上述端口以关闭 Tomcat 的魔法字符串命令。
<Listener>className指定监听器类的全限定名。用于在 Tomcat 生命周期的特定事件(如启动、停止)触发时执行代码。例如: JreMemoryLeakPreventionListener 防止 JRE 内存泄漏。
组件/元素 (Element)关键属性 (Key Attributes)作用与描述
<Service>name为服务提供一个名称,主要用于日志记录。
组件/元素 (Element)关键属性 (Key Attributes)作用与描述
<Connector> (HTTP/1.1)port必填。Connector 监听的 TCP 端口号(如 8080, 8443)。
protocol指定协议处理器。通常使用 HTTP/1.1 来自动选择基于 NIO 或 APR 的高性能实现。
connectionTimeout连接建立后,等待客户端发送请求的超时时间(毫秒)。
redirectPort如果该 Connector 不支持 SSL,但收到了 SSL 请求,将自动重定向到此端口(通常为 8443)。
maxThreads性能调优关键。处理请求的最大线程数,决定了 Tomcat 的并发处理能力。
acceptCount当所有处理线程都在忙碌时,传入连接请求队列的最大长度。
compression是否对响应数据进行 GZIP 压缩(on/off),可节省带宽。
<Connector> (AJP)protocol设置为 AJP/1.3,用于与前置的 HTTP 服务器(如 Apache HTTPD)集成。
secret设置 AJP 连接的密码,增强安全性(与 Apache 的 secret 配置匹配)。
<Connector> (HTTPS/SSL)protocol同上,通常为 HTTP/1.1
port通常为 8443
SSLEnabled设置为 true 以启用 SSL/TLS。
keystoreFile指定服务器证书密钥库(Keystore)文件的路径。
keystorePass密钥库的密码。
ciphers指定启用的加密套件,用于控制安全强度和兼容性。
<SSLHostConfig>(Tomcat 8.5+ 推荐方式) 用于更现代地配置 SSL,替代上述部分 SSL 属性。包含 certificate 等子元素。

谨慎使用 AJP:AJP 协议通常用于与 Apache HTTPD 等 Web 服务器集成。如果 Tomcat 直接面对互联网,通常不需要也不应该开启 AJP Connector,因为它本身没有加密和强认证机制,存在安全风险。

组件/元素 (Element)关键属性 (Key Attributes)作用与描述
<Engine>nameEngine 的名称,用于日志。
defaultHost必填。指定默认的虚拟主机名。如果请求的 Host 头不匹配任何配置的 Host,则使用此主机处理。
<Host>name必填。虚拟主机的域名(如 localhostwww.example.com)。客户端请求的 Host 头必须与此匹配。
appBase必填。指定该虚拟主机的应用程序部署目录(如 webapps)。可以是绝对路径或相对于 $CATALINA_BASE 的相对路径。
autoDeploy是否在 Tomcat 运行时自动部署放入 appBase 目录的新应用或更新。生产环境通常设置为 false
unpackWARs是否将部署的 WAR 包解压为目录。true 利于性能但占用磁盘;false 反之。
<Valve> (在 Host 内)className类似于一个请求过滤器。AccessLogValve 是最常用的,用于记录访问日志。
directory(AccessLogValve) 访问日志文件的存放目录。
pattern(AccessLogValve) 定义日志记录的格式(如 %h %l %u %t "%r" %s %b)。
className="org.apache.catalina.valves.ErrorReportValve"自定义错误页面。
<Context>docBaseWeb 应用的路径。可以是 WAR 文件或解压后的目录路径。
pathWeb 应用的上下文路径。如果为空字符串 "",则该应用是根应用。
reloadable如果为 true,Tomcat 会监视 /WEB-INF/classes/ 和 /WEB-INF/lib/ 的变化并自动重载应用。开发方便,但生产环境应设为 false 以避免性能开销。
sessionTimeout覆盖 web.xml 中配置的会话超时时间(分钟)。

避免在 server.xml 中配置 <Context>:官方推荐将应用特定的 <Context> 配置放在 $CATALINA_BASE/conf/[enginename]/[hostname]/ 目录下的独立 XML 文件中(例如 myapp.xml)。这样更清晰,且无需重启整个 Tomcat 来应用更改(依赖 autoDeploy)。

组件/元素 (Element)关键属性 (Key Attributes)作用与描述
<GlobalNamingResources>定义全局 JNDI 资源,可供所有 Web 应用访问。
<Resource>nameJNDI 资源名称(如 jdbc/myDataSource)。
type资源的 Java 类全名(如 javax.sql.DataSource)。
auth通常为 Container,表示由容器负责管理资源认证。
maxTotal(对于数据库连接池) 连接池最大活动连接数。
driverClassNameJDBC 驱动类名。
url数据库连接 URL。
<Realm>className用于配置用户认证和授权的区域。例如 JDBCRealm(数据库认证)、UserDatabaseRealm(从 conf/tomcat-users.xml 认证)。

3.2.2 conf/web.xml

web.xml:全局部署描述符,为所有 Web 应用提供默认设置

Tomcat 中有 两个 web.xml 文件:

  1. 全局 web.xml (在 $CATALINA_HOME/conf/ 目录下): 此文件为部署在该 Tomcat 实例上的所有 Web 应用程序提供默认的公共配置。它对所有应用生效。

  2. 应用级 web.xml (在 Web 应用的 WEB-INF/ 目录下): 此文件用于配置单个特定的 Web 应用程序。它的配置会覆盖全局 web.xml 中的同名配置。

web.xml 是 Java Web 应用的部署描述符(Deployment Descriptor),其配置遵循 Servlet 规范。它的核心作用是将 URL 映射到特定的 Servlet、定义初始化参数、配置容器提供的各种服务

web.xml示例:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><!-- 1. 应用基本信息 --><display-name>My-Production-Application</display-name><description>This is the production environment configuration for my application.</description><!-- 2. 全局初始化参数 (例如:设置Spring配置文件和Profile) --><context-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/spring/root-context.xml</param-value></context-param><!-- 强烈建议生产环境明确设置激活的Profile,便于条件化配置 --><context-param><param-name>spring.profiles.active</param-name> <param-value>production</param-value></context-param><!-- 3. 监听器 (例如:Spring的ContextLoaderListener) --><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><!-- 4. 过滤器 (Filter) 配置 --><!-- 4.1 字符编码过滤器 (几乎必备) --><filter><filter-name>characterEncodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param><init-param><param-name>forceEncoding</param-name><param-value>true</param-value></init-param></filter><filter-mapping><filter-name>characterEncodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><!-- 4.2 防止XSS攻击的过滤器 (安全增强) --><!-- 注意:你需要引入相应的JAR包(如OWASP ESAPI)或编写自己的XSS过滤逻辑 --><filter><filter-name>xssProtectionFilter</filter-name><filter-class>com.example.security.XSSProtectionFilter</filter-class> </filter><filter-mapping><filter-name>xssProtectionFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><!-- 5. Servlet 配置 --><!-- 5.1 Spring MVC 分发器Servlet --><servlet><servlet-name>appServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value></init-param><!-- 生产环境建议设置load-on-startup,保证服务启动时即初始化 --><load-on-startup>1</load-on-startup><!-- 开启异步支持(如需要) --><async-supported>true</async-supported></servlet><servlet-mapping><servlet-name>appServlet</servlet-name><url-pattern>/</url-pattern></servlet-mapping><!-- 6. 会话 (Session) 配置 --><session-config><!-- 会话超时时间(分钟)。生产环境可根据需求设置,例如30分钟 --><session-timeout>30</session-timeout> <!-- Cookie配置 (Servlet 3.0+) - 生产环境应对Cookie进行安全加固 --><cookie-config><http-only>true</http-only> <!-- 防止XSS读取Cookie --><secure>true</secure> <!-- 仅通过HTTPS传输Cookie (生产环境必须开启) --><!-- <name>MY_SESSIONID</name> --> <!-- 可自定义会话Cookie名 --><!-- <domain>yourdomain.com</domain> --> <!-- 设置Cookie域 --><!-- <path>/</path> --></cookie-config><!-- 追踪模式(建议使用URL重写,而不是COOKIE,以增加兼容性,但现代浏览器已很少需要) --><!-- <tracking-mode>COOKIE</tracking-mode> --></session-config><!-- 7. 错误页面配置 (提供友好且信息可控的错误页面) --><error-page><error-code>404</error-code><location>/WEB-INF/views/errors/404.jsp</location></error-page><error-page><error-code>500</error-code><location>/WEB-INF/views/errors/500.jsp</location></error-page><!-- 也可以捕获特定异常 --><!-- <error-page><exception-type>java.lang.Exception</exception-type><location>/WEB-INF/views/errors/general-error.jsp</location></error-page> --><!-- 8. MIME类型映射 (如有非标准文件类型需要服务器识别) --><mime-mapping><extension>json</extension><mime-type>application/json</mime-type></mime-mapping><!-- 9. 欢迎文件列表 --><welcome-file-list><welcome-file>index.jsp</welcome-file><welcome-file>index.html</welcome-file></welcome-file-list><!-- 10. 安全配置 (声明式安全 - 通常在应用服务器中配置更常见,但也可在此定义) --><!-- 注意:以下为示例,具体角色和约束需根据应用调整 --><!--<security-constraint><web-resource-collection><web-resource-name>Protected Resources</web-resource-name><url-pattern>/admin/*</url-pattern></web-resource-collection><auth-constraint><role-name>admin</role-name></auth-constraint></security-constraint><login-config><auth-method>FORM</auth-method><form-login-config><form-login-page>/login</form-login-page><form-error-page>/login?error</form-error-page></form-login-config></login-config><security-role><role-name>admin</role-name></security-role>--></web-app>
配置元素 (Element)所属范围作用描述示例或备注
<web-app>根元素所有配置的根容器,定义了配置文件的版本和Schema。xmlns="http://xmlns.jcp.org/xml/ns/javaee" version="4.0"
<display-name>应用级为Web应用提供一个可读的名称,用于管理工具(如Tomcat Manager)显示。<display-name>My Awesome App</display-name>
<description>应用级提供一段关于此Web应用的描述文本。<description>This app does amazing things.</description>
<context-param>应用级定义应用范围内的全局初始化参数,所有Servlet和JSP都可以通过 ServletContext.getInitParameter() 获取。<param-name>jdbcURL</param-name><param-value>jdbc:mysql://localhost:3306/mydb</param-value>
Servlet 相关配置
<servlet>应用级声明一个Servlet。包含 <servlet-name> 和 <servlet-class>(或 <jsp-file>)。
↳ <servlet-name>应用级为Servlet定义一个逻辑名称,用于在<servlet-mapping>中引用。<servlet-name>FancyServlet</servlet-name>
↳ <servlet-class>应用级指定Servlet对应的完整Java类名。<servlet-class>com.example.FancyServlet</servlet-class>
↳ <jsp-file>应用级指定一个JSP文件作为Servlet。<jsp-file>/index.jsp</jsp-file>
↳ <init-param>应用级定义该Servlet独有的初始化参数。可通过 ServletConfig.getInitParameter() 获取。<param-name>configFile</param-name><param-value>/WEB-INF/config.xml</param-value>
↳ <load-on-startup>应用级控制Servlet的加载时机。值为正数时,容器在启动时即加载并初始化该Servlet(数值越小优先级越高)。<load-on-startup>1</load-on-startup>
<servlet-mapping>应用级将URL模式映射到已声明的Servlet
↳ <servlet-name>应用级引用在 <servlet> 中定义的逻辑名称。<servlet-name>FancyServlet</servlet-name>
↳ <url-pattern>应用级定义匹配的URL模式(如 /api/**.do/foo)。<url-pattern>/api/*</url-pattern>
Filter 相关配置
<filter>应用级声明一个过滤器(Filter)。包含 <filter-name> 和 <filter-class>
↳ <filter-name>应用级为Filter定义一个逻辑名称。<filter-name>AuthFilter</filter-name>
↳ <filter-class>应用级指定Filter对应的完整Java类名。<filter-class>com.example.AuthFilter</filter-class>
↳ <init-param>应用级定义该Filter独有的初始化参数。
<filter-mapping>应用级将Filter与URL模式或Servlet关联,决定Filter对哪些请求生效。
↳ <filter-name>应用级引用在 <filter> 中定义的逻辑名称。<filter-name>AuthFilter</filter-name>
↳ <url-pattern>应用级定义Filter要拦截的URL模式。<url-pattern>/secure/*</url-pattern>
↳ <servlet-name>应用级定义Filter要拦截的特定Servlet。<servlet-name>AdminServlet</servlet-name>
Listener 配置
<listener>应用级声明一个事件监听器(Listener)
↳ <listener-class>应用级指定监听器对应的完整Java类名。监听器用于响应Web应用生命周期事件(如启动、关闭)和会话事件。<listener-class>com.example.MyContextListener</listener-class>
会话(Session)配置
<session-config>应用级/全局配置HTTP会话的全局设置。
↳ <session-timeout>应用级/全局指定会话默认的超时时间(分钟)。-1或负数表示永不过期。<session-timeout>30</session-timeout>
MIME 类型映射
<mime-mapping>全局/应用级将文件扩展名映射到MIME类型全局web.xml中已包含大量常见映射。
↳ <extension>全局/应用级文件扩展名(不带点)。<extension>pdf</extension>
↳ <mime-type>全局/应用级对应的MIME类型。<mime-type>application/pdf</mime-type>
欢迎文件列表
<welcome-file-list>应用级/全局当用户访问目录URL时(如 http://host/app/),容器按顺序查找并返回的文件列表。
↳ <welcome-file>应用级/全局定义欢迎文件名。<welcome-file>index.html</welcome-file> <welcome-file>index.jsp</welcome-file>
错误页面处理
<error-page>应用级配置特定HTTP错误代码或异常类型所对应的自定义错误页面
↳ <error-code>应用级HTTP错误代码(如404、500)。<error-code>404</error-code>
↳ <exception-type>应用级Java异常的全限定类名(如 java.io.IOException)。<exception-type>java.lang.Exception</exception-type>
↳ <location>应用级显示的错误页面路径(相对于web应用根目录)。<location>/error/404.html</location>
安全相关配置
<security-constraint>应用级定义资源的安全约束(哪些URL需要认证、需要什么角色、使用什么传输保证)。
<login-config>应用级配置Web应用的认证方式(如BASIC, DIGEST, FORM, CLIENT-CERT)。<auth-method>FORM</auth-method><form-login-config><form-login-page>/login.html</form-login-page><form-error-page>/login-error.html</form-error-page></form-login-config>
<security-role>应用级声明应用中使用的安全角色名称<role-name>admin</role-name>

3.2.3 conf/context.xml

context.xml:全局上下文配置,定义所有 Web 应用共享的资源。一个 Context 代表一个独立的 Web 应用程序。

核心作用context.xml 主要用于配置与应用本身密切相关的资源、参数和行为,如数据库连接池(JNDI DataSource)、会话(Session)管理、监控阀门(Valves)、初始化参数等。

与全局的 server.xml 不同,context.xml 的配置可以出现在多个位置,且优先级不同(从上到下,优先级递增):

  1. $CATALINA_BASE/conf/context.xml: 此文件中的配置适用于所有部署到该 Tomcat 实例的 Web 应用程序。是全局默认配置。

  2. $CATALINA_BASE/conf/[enginename]/[hostname]/context.xml.default: 适用于部署到特定虚拟主机(Host)的所有 Web 应用程序。

  3. 应用特定的 XML 文件: 在 $CATALINA_BASE/conf/[enginename]/[hostname]/ 目录下,创建 [appname].xml 文件(例如 myapp.xml)。此文件中的配置仅适用于该特定应用。这是生产环境推荐的方式,因为它与应用解耦,无需修改 server.xml 或全局 context.xml

  4. Web 应用内部的 /META-INF/context.xml: 打包在 WAR 文件或应用目录中。此配置随应用一起发布,适用于该应用本身。

context.xml示例:在 $CATALINA_BASE/conf/Catalina/localhost/ 下创建 myapp.xml,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<!-- 此配置仅适用于 'myapp' 这个应用 -->
<Context><!-- 1. 禁用开发特性,提升性能 --><WatchedResource>WEB-INF/web.xml</WatchedResource><WatchedResource>WEB-INF/tomcat-web.xml</WatchedResource><WatchedResource>${catalina.base}/conf/web.xml</WatchedResource><!-- 2. 配置数据库连接池 (JNDI DataSource) --><Resource name="jdbc/MyAppDS" auth="Container"type="javax.sql.DataSource"username="prod_db_user"password="very_strong_password"driverClassName="com.mysql.cj.jdbc.Driver"url="jdbc:mysql://dbserver:3306/prod_db?useUnicode=true&amp;characterEncoding=UTF-8&amp;useSSL=true"maxTotal="50"maxIdle="20"minIdle="5"maxWaitMillis="10000"validationQuery="SELECT 1"testOnBorrow="true"removeAbandonedOnBorrow="true"removeAbandonedTimeout="60" /><!-- 3. 配置会话Cookie为Secure和HttpOnly --><SessionConfig><cookie secure="true" httpOnly="true" /></SessionConfig><!-- 4. 如果前面有反向代理,配置RemoteIpValve以获取真实客户端IP --><Valve className="org.apache.catalina.valves.RemoteIpValve"remoteIpHeader="x-forwarded-for"proxiesHeader="x-forwarded-by"protocolHeader="x-forwarded-proto" />
</Context>
元素/属性 (Element/Attribute)作用与描述
<Context>根元素,代表一个 Web 应用上下文。
path=""应用的上下文路径(访问路径)。例如,path="/shop" 意味着应用可通过 http://host:port/shop 访问。设置为空字符串 "" 表示将此应用设为根应用(通过 http://host:port/ 访问)。注意:在独立的应用 XML 文件中,此属性通常由文件名决定,无需在 <Context> 标签内重复指定。
docBase="myapp"Web 应用所在的位置。可以是 WAR 文件的路径(如 myapp.war)或应用程序目录的路径(如 webapps/myapp)。可以是绝对路径,也可以是相对于 $CATALINA_BASE/webapps 的相对路径。
reloadable="false"生产环境关键设置。如果设为 true,Tomcat 会监视 /WEB-INF/classes/ 和 /WEB-INF/lib/ 的变化,并自动重新加载应用。开发环境非常方便,但生产环境会带来严重性能开销,必须设为 false
crossContext="true"是否允许应用通过 ServletContext.getContext() 方法获取其他 Web 应用的上下文。通常出于安全考虑设为 false
useHttpOnly="true"是否为会话 Cookie 设置 HttpOnly 属性,有助于减轻跨站脚本(XSS)攻击的风险。生产环境应设为 true
元素/属性 (Element/Attribute)作用与描述
<Resource>定义 JNDI 资源,最常见的是数据库连接池(DataSource)。
name="jdbc/MyDB"资源的 JNDI 名称。应用将在 java:comp/env/jdbc/MyDB 下查找此资源。
auth="Container"指定由容器(Tomcat)来管理资源的认证。
type="javax.sql.DataSource"资源的 Java 类型。对于数据库连接池,这是 javax.sql.DataSource
username="dbuser" password="dbpass"连接数据库的用户名和密码。
driverClassName="com.mysql.cj.jdbc.Driver"JDBC 驱动类的全限定名。
url="jdbc:mysql://localhost:3306/mydb"数据库的 JDBC 连接 URL。
maxTotal="20" maxIdle="10" minIdle="5" maxWaitMillis="10000"连接池关键性能参数maxTotal:最大活动连接数;maxIdle:最大空闲连接数;minIdle:最小空闲连接数;maxWaitMillis:获取连接的最大等待时间(毫秒)。
validationQuery="SELECT 1"用于验证连接是否有效的简单 SQL 查询语句。
testOnBorrow="true"在从池中借出连接前是否进行验证。建议为 true,确保应用拿到的连接是有效的。
<ResourceLink>用于在当前应用的 JNDI 上下文中链接(引用) 在全局 (server.xml 或 globalNamingResources) 中定义的资源。
元素/属性 (Element/Attribute)作用与描述
<Manager>配置会话管理器,控制如何创建、管理会话。
className="org.apache.catalina.session.PersistentManager"指定管理器实现类。PersistentManager 会在会话空闲时将其序列化到存储中(如磁盘),适合大型应用或集群环境。
className="org.apache.catalina.session.StandardManager"默认管理器。重启 Tomcat 时会将会话序列化到磁盘,但运行时所有会话都在内存中。
<Store>与 PersistentManager 配合使用,定义会话的持久化存储方式(如文件存储 FileStore 或 JDBC 存储 JDBCStore)。
<Valve className="org.apache.catalina.valves.PersistentValve" />启用会话持久化功能的阀门。
<SessionConfig>(Tomcat 8.5+ 推荐方式) 用于配置会话相关参数,替代旧属性。
<cookie>在 <SessionConfig> 内,用于配置会话 Cookie 的属性。
httpOnly="true"(在 <cookie> 内)同上,设置 HttpOnly 属性。
secure="true"(在 <cookie> 内)指示浏览器仅通过 HTTPS 协议发送会话 Cookie。在启用 HTTPS 的生产环境中应设为 true
元素/属性 (Element/Attribute)作用与描述
<Valve>阀门,用于在请求处理管道中插入处理逻辑,功能类似过滤器,但更底层。
className="org.apache.catalina.valves.RemoteIpValve"极其重要。当 Tomcat 前面有反向代理(如 Nginx, Apache HTTPD)时,此阀门用于识别原始客户端的真实 IP。它会处理 X-Forwarded-ForX-Forwarded-Proto 等头信息。
className="org.apache.catalina.valves.AccessLogValve"此特定应用配置访问日志,格式和输出位置可与全局的 Host 级别访问日志不同。
className="org.apache.catalina.authenticator.FormAuthenticator"处理 FORM 表单认证的阀门。
元素/属性 (Element/Attribute)作用与描述
<Environment>配置一个作为 JNDI 环境条目(java:comp/env/)的变量,应用可以通过 InitialContext.lookup() 获取。
name="appSettings/configPath" value="/opt/config" type="java.lang.String"例如,定义一个字符串类型的环境变量,应用可通过 java:comp/env/appSettings/configPath 获取其值 "/opt/config"。常用于解耦配置。
<Loader>定义自定义的类加载器行为。
delegate="true"类加载委托模式。默认为 false(Tomcat 先自己加载类,不行再委托给父加载器)。设为 true 则遵循标准 Java 双亲委托模型。在某些复杂依赖场景下可能需要调整。

3.2.4 conf/tomcat-users.xml

tomcat-users.xml:用户、角色和认证信息的配置,用于管理能够访问 Tomcat 管理界面(如 Manager 和 Host Manager)或受保护 Web 应用资源的用户、角色和组(但组不常用)。它核心定义了“谁”(用户)拥有“什么权限”(角色)。

tomcat-users.xml示例:

<?xml version='1.0' encoding='utf-8'?>
<tomcat-users><!-- 定义Tomcat内置的管理角色 --><role rolename="manager-gui"/><role rolename="manager-status"/><role rolename="manager-script"/><role rolename="manager-jmx"/><role rolename="admin-gui"/><role rolename="admin-script"/><!-- 1. 监控专用账户:仅能查看服务器状态,无法进行任何管理操作 --><user username="status_monitor" password="Very$tr0ngP@ssw0rd1" roles="manager-status"/><!-- 2. 自动化部署账户 (供CI/CD工具如Jenkins使用):允许通过脚本接口部署 --><user username="ci_deploy_user" password="Another$tr0ngP@ssw0rd!" roles="manager-script"/><!-- 3. 管理员账户 (应极少使用且权限分离) --><!-- 3.1 Web应用管理员:能通过GUI界面管理Web应用,但不能管理虚拟主机 --><user username="app_admin" password="Super$ecureP@ss2" roles="manager-gui"/><!-- 3.2 虚拟主机管理员:能管理虚拟主机 --><user username="host_admin" password="HostAdmin@123" roles="admin-gui"/><!-- 3.3 超级管理员 (仅在紧急情况下使用):拥有所有权限 --><user username="super_admin" password="Extremely!Complex@Pass" roles="manager-gui, manager-script, manager-jmx, manager-status, admin-gui, admin-script"/>
</tomcat-users>
配置元素 (Element)作用描述属性 (Attributes)示例或备注
<tomcat-users>根元素,包含所有用户、角色和组的定义。<tomcat-users> ... </tomcat-users>
<role>定义一个角色。角色代表一组权限,例如访问特定管理功能的权限。rolename : 角色名称。<role rolename="manager-gui"/> 注意:角色名通常是 Tomcat 内置的,自定义角色需与 web.xml 中的安全约束配合使用。
<user>定义一个用户,并为其分配角色。username : 用户名。 password : 密码。 roles : 分配给该用户的角色列表,多个角色用英文逗号分隔。<user username="admin" password="secret" roles="manager-gui, admin-gui"/> 安全提醒:生产环境务必使用强密码。
<group> (较少使用)定义一个用户组,可以将多个用户归入一个组,便于批量管理角色(但实践中直接为用户分配角色更常见)。groupname : 组名称。<group groupname="tomcat-group"/> 需要与用户配置配合使用。
角色名称 (rolename)授予的访问权限
manager-gui允许访问 Manager App 的 HTML 图形界面(用于部署和管理 Web 应用程序)。
manager-script允许访问 Manager 的基于文本的接口和状态页面(为诸如 Ant 脚本或 CI/CD 工具等自动化工具提供支持)。
manager-jmx允许访问 JMX 代理接口和“服务器状态”页面。
manager-status仅允许访问“服务器状态”(Server Status)页面以查看服务器运行状况。
admin-gui允许访问 Host Manager 的 HTML 图形界面(用于管理虚拟主机)。
admin-script允许访问 Host Manager 的脚本接口。


文章转载自:

http://6zM3vEZf.kcnjz.cn
http://vSKjlTQo.kcnjz.cn
http://zW62toSd.kcnjz.cn
http://jAUST1rn.kcnjz.cn
http://p1NlTvdH.kcnjz.cn
http://Q5hc4Jq8.kcnjz.cn
http://VW7Iqmoy.kcnjz.cn
http://2lBOtlFf.kcnjz.cn
http://Ys1jpf9n.kcnjz.cn
http://mYTu9EDu.kcnjz.cn
http://cTOnmGQW.kcnjz.cn
http://mxWD798T.kcnjz.cn
http://XpPiy8hg.kcnjz.cn
http://x0z2RSSc.kcnjz.cn
http://ZUmAIFTn.kcnjz.cn
http://DaZrsFVF.kcnjz.cn
http://HFMxbDus.kcnjz.cn
http://sYbXoGVU.kcnjz.cn
http://I13uKZJ9.kcnjz.cn
http://KQKlkUZB.kcnjz.cn
http://jYSeX1xT.kcnjz.cn
http://xhLlPBnx.kcnjz.cn
http://0E6ElPsT.kcnjz.cn
http://9sH2NP1h.kcnjz.cn
http://2ZH03xdh.kcnjz.cn
http://wGT2IqEk.kcnjz.cn
http://JYPNUPAL.kcnjz.cn
http://VBtuLz0L.kcnjz.cn
http://ZJOQP6qh.kcnjz.cn
http://gFuMcswU.kcnjz.cn
http://www.dtcms.com/a/375142.html

相关文章:

  • 无人机电压模块技术剖析
  • 无人机图传通信模组——16公里抗干扰稳定传输的高性能解决方案
  • 高效 P2P 文件传输工具:FileSync 利用 WebRTC 技术实现极速安全传输
  • UOS20系统安装与 SSH/XRDP 远程访问功能配置指南
  • Spark学习(python版本)
  • 【XR行业应用】XR+工业,从远程协助到数字孪生,如何颠覆制造业?
  • 将Varjo XR技术融入飞行模拟器,有效降低成本提升训练效果
  • 深入了解linux系统—— POSIX信号量
  • K8S集群管理(2)
  • 安装JUPYTERHUB - 不使用LINUX本地用户
  • 如何实现 Vuex 中的 Store 插件
  • 少儿舞蹈小程序(11)作品与活动展示
  • crew AI笔记[6] - tools特性示例
  • 英一2009年真题学习笔记
  • 【mq】rabbit-mq学习笔记
  • 《数据库系统概论》第一章 初识数据库
  • 如何在Ubuntu 22.04系统上安装CUDA 12.9
  • 深入剖析LLM:从原理到应用与挑战
  • JavaWeb解决中文乱码问题
  • 控制台Connection closed by 198.18.0.3 port 22
  • AI视觉算法中的OpenCV API
  • 前后端分离架构中,Node.js的底层实现原理与线程池饥饿问题解析
  • Qt QML实现无边框窗口
  • 实战:HarmonyOS 中 HEIF 图像开发全流程(显示篇)
  • 经济学+机器学习+R语言:十大原理、熵权法、随机森林、神经网络、因果推断全解析
  • FPGA硬件设计-基础流程
  • 对expat库XML_Parse函数调用优化的测试
  • 构建未来:深度学习、嵌入式与安卓开发的融合创新之路
  • 第1节-PostgreSQL入门-什么是PostgreSQL
  • odoo18委外采购