0%

Tomcat 管理功能详解:host-manager 与 manager

Tomcat 提供了两套内置的管理工具 ——host-managermanager,分别用于管理虚拟主机和 Web 应用。这些工具通过网页界面或脚本方式操作,简化了 Tomcat 的日常运维工作。本文将详细介绍这两个工具的配置与使用。

访问控制配置:tomcat-users.xml

host-managermanager 均需通过角色权限控制访问,配置文件为 conf/tomcat-users.xml。需在该文件中定义用户及对应的角色,才能登录管理页面。

核心角色说明

工具 角色名称 权限描述
host-manager admin-gui 允许访问 host-manager 的 HTML 页面。
admin-script 允许通过文本接口(如 curl)操作 host-manager。
manager manager-gui 允许访问 manager 的 HTML 页面。
manager-script 允许通过文本接口操作 manager。
manager-jmx 允许通过 JMX 方式管理 Tomcat。
manager-status 仅允许查看服务器状态页面。

配置示例

tomcat-users.xml 中添加如下配置(需放在 <tomcat-users> 标签内):

阅读全文 »

Tomcat 内置过滤器详解

Tomcat 提供了多种内置过滤器(Filter),用于处理跨域请求、安全防护、编码设置等常见场景。这些过滤器通过配置 web.xml 即可生效,无需手动编码实现。本文将详细介绍常用的 Tomcat 内置过滤器及其配置方式。

CorsFilter:跨域资源共享过滤器

org.apache.catalina.filters.CorsFilter 实现了 W3C 跨域资源共享(CORS)规范,用于解决前端跨域请求被浏览器拦截的问题。其核心功能是在 HTTP 响应中添加 Access-Control-* 系列头信息,允许指定域的请求访问资源。

配置示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<filter>
<filter-name>CorsFilter</filter-name>
<filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
<!-- 允许访问的源域名(多个用逗号分隔,* 表示允许所有) -->
<init-param>
<param-name>cors.allowed.origins</param-name>
<param-value>https://example.com,http://localhost:3000</param-value>
</init-param>
<!-- 允许的 HTTP 方法 -->
<init-param>
<param-name>cors.allowed.methods</param-name>
<param-value>GET,POST,PUT,DELETE,OPTIONS</param-value>
</init-param>
<!-- 允许的请求头 -->
<init-param>
<param-name>cors.allowed.headers</param-name>
<param-value>Content-Type,Authorization,X-Requested-With</param-value>
</init-param>
<!-- 允许暴露给客户端的响应头 -->
<init-param>
<param-name>cors.exposed.headers</param-name>
<param-value>Access-Control-Allow-Origin</param-value>
</init-param>
<!-- 是否支持带凭据的请求(如 Cookie、Authorization) -->
<init-param>
<param-name>cors.support.credentials</param-name>
<param-value>true</param-value>
</init-param>
<!-- 预检请求(OPTIONS)结果的缓存时间(秒) -->
<init-param>
<param-name>cors.preflight.maxage</param-name>
<param-value>3600</param-value> <!-- 1小时 -->
</init-param>
</filter>
<filter-mapping>
<filter-name>CorsFilter</filter-name>
<url-pattern>/*</url-pattern> <!-- 对所有请求生效 -->
</filter-mapping>

关键参数说明

  • cors.allowed.origins:限制允许跨域的源(避免滥用 *,生产环境建议指定具体域名)。
  • cors.support.credentials:设为 true 时,cors.allowed.origins 不能为 *,需指定具体域名。
  • cors.preflight.maxage:减少预检请求次数,提升性能。

CsrfPreventionFilter:跨站请求伪造防护

CsrfPreventionFilter 用于防御跨站请求伪造(CSRF)攻击,原理是:

阅读全文 »

Google Bigtable深度解析:分布式存储的设计典范

Google Bigtable 作为分布式结构化数据存储的里程碑技术,其设计理念深刻影响了 HBase、Cassandra 等开源分布式数据库。Bigtable 以高扩展性、高可用性和灵活的数据模型为核心,通过双层架构(GFS 持久化 + 分布式索引)支撑 PB 级数据存储与高效访问。本文将从数据模型、系统架构、核心组件及技术特点等方面全面解析 Bigtable,揭示其成为分布式存储标杆的底层逻辑。

Bigtable 核心定位与设计目标

Bigtable 是 Google 为解决大规模结构化数据存储问题开发的分布式数据库,主要目标包括:

  • 高扩展性:支持从 TB 到 PB 级数据的无缝扩展,单表可容纳数万亿行数据;
  • 高可用性:通过多副本、故障自动恢复等机制,确保数据不丢失且服务持续可用;
  • 灵活的数据模型:支持半结构化数据存储,适应多样化的应用场景(如搜索索引、日志存储、用户数据);
  • 高效读写:优化随机读写性能,支持按行键范围的批量操作。

Bigtable 数据模型:灵活的三维有序映射

Bigtable 的数据模型不同于传统关系型数据库,它是一种 稀疏的、分布式的、持久化的多维有序映射,核心结构可表示为:

1
(row:string, column:string, timestamp:int64) → string  

核心概念解析

  1. 行(Row)
    • 每行通过 Row Key(行键) 唯一标识,按字典序全局排序,这是 Bigtable 高效范围查询的基础;
    • 行的读写操作是 原子性的(无论操作涉及多少列),适合存储实体的完整信息(如一个用户的所有属性)。
  2. 列(Column)
    • 列名由 列族(Column Family)限定符(Qualifier) 组成,格式为 family:qualifier(如 user:namelog:error);
    • 列族 是访问控制、存储和压缩的基本单元,需在表创建时预先定义,数量不宜过多(通常不超过数百个);
    • 限定符 无需预先定义,可动态添加,使数据模型具备极强的灵活性(如 user:emailuser:phone 可随时扩展)。
  3. 时间戳(Timestamp)
    • 每个单元格(Cell)可存储多个版本的数据,通过时间戳区分(默认精确到毫秒);
    • 版本管理策略可自定义(如保留最近 N 个版本、保留指定时间范围内的版本),适合存储历史数据(如用户操作日志的变更记录)。
  4. 单元格(Cell)
    • (Row Key, Column, Timestamp) 唯一标识的最小数据单元,存储的值为字符串(二进制安全,可存储任意数据)。

数据模型示例

以存储用户行为日志为例,Bigtable 的数据结构如下:

Row Key(用户 ID) Column: log:login(登录日志) Column: log:action(操作日志)
user_001 t1: "2023-10-01 08:00" t1: "view_page"
t2: "2023-10-02 09:30" t2: "click_button"
user_002 t1: "2023-10-01 10:15" t1: "submit_form"
阅读全文 »

Tomcat server.xml 配置文件详解

server.xml 是 Tomcat 最核心的配置文件,定义了服务器的整体结构、组件关系及运行参数。本文将逐节点解析其配置细节,帮助理解 Tomcat 的工作机制及优化配置。

配置文件整体结构

Tomcat 的 server.xml 采用 XML 格式,核心节点层级关系如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
<Server>                 <!-- 整个 Tomcat 服务器 -->
<Listener /> <!-- 生命周期监听器 -->
<GlobalNamingResources /> <!-- 全局命名资源 -->
<Service> <!-- 服务(连接器 + 引擎) -->
<Executor /> <!-- 共享线程池 -->
<Connector /> <!-- 连接器(接收请求) -->
<Engine> <!-- 引擎(处理请求) -->
<Host> <!-- 虚拟主机 -->
<Context /> <!-- Web 应用上下文 -->
</Host>
</Engine>
</Service>
</Server>

每个节点代表 Tomcat 的一个核心组件,负责特定功能。

核心节点解析

<Server>:整个 Tomcat 实例的根节点

<Server> 是配置文件的根元素,代表整个 Tomcat 服务器,负责启动和管理所有组件。

主要属性
  • port:服务器监听的关闭端口(默认 8005),用于接收关闭命令。

  • shutdown:关闭服务器的指令字符串(默认 SHUTDOWN)。

    示例:通过 telnet 发送关闭命令:

    1
    2
    telnet 127.0.0.1 8005
    > SHUTDOWN # 输入后 Tomcat 会关闭
子节点
  • <Listener>:生命周期监听器,用于监控服务器启动、停止等事件(如 VersionLoggerListener 记录版本信息)。
  • <GlobalNamingResources>:全局 JNDI 资源配置(如数据源),供所有应用共享。
  • <Service>:一个或多个服务组件,每个服务包含连接器和引擎。

<Service>:连接器与引擎的组合

<Service> 将多个连接器(Connector)与一个引擎(Engine)绑定,形成一个独立的服务单元。

属性
  • name:服务名称(默认 Catalina),用于标识服务。
子节点
  • <Executor>:配置共享线程池,供多个连接器复用(优化性能)。
  • <Connector>:连接器,负责接收客户端请求。
  • <Engine>:引擎,负责处理连接器接收的请求。

<Executor>:共享线程池(性能优化关键)

<Executor> 定义全局线程池,多个连接器可共享该线程池,避免重复创建线程,提升性能。默认不配置,需手动添加。

配置示例
阅读全文 »

Tomcat JSP 引擎:Jasper 工作机制详解

在 Java Web 开发中,JSP(JavaServer Pages)是一种动态网页技术,它允许在 HTML 中嵌入 Java 代码。Tomcat 作为主流的 Servlet 容器,内置了专门的 JSP 引擎 ——Jasper,负责将 JSP 文件编译为 Servlet 类并执行。本文将详细解析 Jasper 的工作原理,包括运行时编译和预编译两种模式。

Jasper 引擎概述

Jasper 是 Tomcat 处理 JSP 的核心组件,其主要功能包括:

  • JSP 解析:将 JSP 文件中的 HTML 标签、JSP 指令(如 <%@ page %>)、脚本片段(如 <% ... %>)等解析为 Java 代码。
  • 编译:将解析后的 Java 代码编译为 Class 文件(Servlet 实现类)。
  • 执行:通过生成的 Servlet 类处理 HTTP 请求,生成动态响应。

Jasper 集成在 Tomcat 中,无需额外配置即可工作。其入口是 Tomcat 内置的 JspServlet,该 Servlet 在 conf/web.xml 中默认配置,用于处理所有以 .jsp.jspx 结尾的请求。

运行时编译:首次请求触发

Tomcat 并不会在 Web 应用启动时自动编译所有 JSP 文件,而是采用惰性编译策略 —— 仅在客户端第一次请求某个 JSP 页面时才触发编译。这一过程由 JspServlet 主导,具体流程如下:

1. JspServlet 配置

Tomcat 的 conf/web.xml 中默认配置了 JspServlet,负责拦截 JSP 请求:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
<init-param>
<param-name>fork</param-name>
<param-value>false</param-value> <!-- 是否使用独立进程编译 -->
</init-param>
<init-param>
<param-name>xpoweredBy</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>3</load-on-startup> <!-- 启动时加载,优先级 3 -->
</servlet>

<servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>*.jsp</url-pattern>
<url-pattern>*.jspx</url-pattern>
</servlet-mapping>
阅读全文 »