Bảo vệ ứng dụng web Tomcat
tomcat biến một tệp WAR thành nền Tomcat tự chứa. Nó dùng các thành phần Tomcat tích hợp sẵn trong trình đóng gói và hoàn toàn không đụng tới bản Tomcat cài trên máy bạn.
1. Thao tác trên giao diện đồ họa
-
Ở trang loại ứng dụng, chọn Tomcat WAR.

-
Chọn tệp WAR đầu vào, phiên bản Java đi kèm và các nền tảng mục tiêu, rồi chọn chế độ đơn giản hoặc nâng cao.

-
Ở chế độ nâng cao, chọn Tomcat 9 hoặc 10.1, hoặc để chế độ tự phát hiện, rồi đặt đường dẫn ngữ cảnh, tùy chọn khởi chạy JVM và quy tắc loại trừ nếu cần. Chế độ đơn giản xác định phiên bản Tomcat từ lượt quét tương thích. Ý nghĩa từng tùy chọn xem tại Thiết lập chế độ nâng cao của Protector4J.

-
Chọn thư mục xuất, xem lại phần tóm tắt rồi bấm Chạy bảo vệ.

2. Ví dụ dòng lệnh
Chỉ định đường dẫn ngữ cảnh:
p4j tomcat app.war dist --context /app
Quét tương thích và tự động áp dụng khuyến nghị:
p4j tomcat app.war --compat-scan
p4j tomcat app.war dist --compat-apply --context /app
Hai tùy chọn này không dùng chung được. Khác biệt như sau:
| Tùy chọn | Tác dụng | Khi nào dùng |
|---|---|---|
--compat-scan | Chỉ quét tệp WAR đầu vào, in ra rủi ro và khuyến nghị cấu hình rồi kết thúc. Không mã hóa và không tạo dist, nên không cần thư mục xuất. | Hãy xem báo cáo trước ở lần bảo vệ đầu tiên, sau khi nâng cấp các phụ thuộc liên quan tới Tomcat, sau khi đổi phạm vi bảo vệ hay thiết lập JSP, và khi truy tìm sự cố tương thích. |
--compat-apply | Quét xong thì gộp các khuyến nghị an toàn, tiếp tục mã hóa và ghi kết quả, nên bắt buộc phải có thư mục xuất. | Dùng để hoàn tất đóng gói khi bạn đã đọc kết quả quét và chấp nhận khuyến nghị. Cũng hợp với các lần dựng lặp lại và quy trình CI đã kiểm chứng quy tắc. |
Với tomcat, --compat-apply có thể thêm quy tắc loại trừ dựa trên kết quả quét, đồng thời điều chỉnh phiên bản Tomcat, lớp phủ ZIP và hậu tố kho lưu trữ. Với ba mục sau, giá trị bạn chỉ định rõ trên dòng lệnh được ưu tiên. Các lớp loại trừ được khuyến nghị sẽ gộp sẵn với mẫu --exclude bạn tự viết; nếu không muốn thêm tự động, hãy truyền kèm --no-compat-excludes. Trình quét chỉ phân tích tĩnh theo phỏng đoán, nên những vấn đề buộc phải sửa mã sẽ không được --compat-apply khắc phục, và ứng dụng sau khi đóng gói vẫn cần kiểm thử hồi quy trên nền tảng mục tiêu.
Các lệnh khác, toàn bộ tùy chọn, biến môi trường và ví dụ tự động hóa nằm trong Tham chiếu dòng lệnh.
Giá trị mặc định của --tomcat-version là auto. Đặt thành 9 hoặc 10.1 khi bạn muốn chỉ định rõ:
p4j tomcat app.war dist --context /app --tomcat-version 10.1
3. Cấu trúc đầu ra
dist/
├── bin/
│ ├── catalina.sh
│ ├── startup.sh
│ ├── shutdown.sh
│ └── *.bat
├── conf/p4jx/
│ ├── contexts.list
│ ├── protected-classes.list
│ └── allowed-prefixes.list
├── protected/
│ └── app.p4jx
├── lib/
│ ├── p4jx-tomcat-runtime.jar
│ └── tomcat-runtime-deps.jar
├── vlxjre/
├── run.sh
└── run.bat
Mặc định không sinh ra tệp WAR vật lý. Tệp web.xml, tài nguyên tĩnh, các lớp không được bảo vệ, phần khung siêu dữ liệu và phần cài đặt đã bảo vệ đều nằm trong protected/<ngữ_cảnh>.p4jx, được đưa tới Tomcat qua WebResourceSet của P4JX.
4. Khởi động và dừng
Chạy ở tiền cảnh:
./run.sh
Khởi động và dừng ở hậu cảnh theo cách của Tomcat:
./bin/startup.sh
./bin/shutdown.sh
Trên Windows dùng các tệp .bat tương ứng. Nhật ký được ghi vào thư mục logs/ bên trong đầu ra.
Khi đóng gói cho Windows, bạn còn có thể tạo thêm trình khởi chạy gốc để chạy Tomcat nhúng ở tiền cảnh — xem Tạo trình khởi chạy EXE Windows.
Tùy chọn khởi chạy JVM
Khi đóng gói, hãy nhập mỗi dòng một tùy chọn ở mục Tùy chọn khởi chạy JVM trên giao diện, hoặc chỉ định trên dòng lệnh:
p4j tomcat app.war dist \
--context /app \
--jvm-option -Xms1g \
--jvm-option -Xmx2g
Để đổi trong một gói đã triển khai:
- macOS và Linux: sửa
bin/catalina.sh, thêmJVM_OPTS+=("-Xms1g" "-Xmx2g")sau dòngJVM_OPTS=(...)bên trongrun_java(). Cách này áp dụng cho cả lúc chạy tiền cảnh lẫn lúc khởi động hậu cảnh bằngstartup.sh. - Windows, tiền cảnh: sửa
bin\catalina.bat, thêmset "JVM_OPTS=%JVM_OPTS% -Xms1g -Xmx2g"sau dòngset "JVM_OPTS=..."sẵn có. - Windows, hậu cảnh: thêm
set "APP_JAVA_OPTS=-Xms1g -Xmx2g"vàobin\startup.battrước khi nó gọicatalina.bat. Nếu cần một bộ tùy chọn cố định dùng chung cho cả hai trường hợp, tạo lại gói bằng giao diện hoặc dòng lệnh sẽ gọn hơn.
Bạn cũng có thể đặt APP_JAVA_OPTS ngay trước lệnh để chỉ áp dụng cho một lần chạy. Ví dụ đầy đủ cho CMD, PowerShell và tập lệnh nằm trong Tùy chọn khởi chạy JVM.
5. Chọn phiên bản Tomcat
| Không gian tên API trong WAR | Tomcat | Java cần có |
|---|---|---|
javax.servlet.* | Tomcat 9 | Java 8, 11, 17, 21 hoặc 25 |
jakarta.servlet.* | Tomcat 10.1 | Java 11, 17, 21 hoặc 25 |
Bộ phát hiện tự động xác định không gian tên trước hết từ các lớp ứng dụng và tệp mô tả triển khai; tên các JAR chỉ là bằng chứng phụ. Nếu cả javax lẫn jakarta cùng xuất hiện, công cụ sẽ không đoán bừa.
6. JSP
Khi tệp WAR có chứa JSP, mặc định chúng được biên dịch trước thành lớp servlet và ánh xạ URL ngay trong lúc mã hóa. Biên dịch JSP lúc chạy sẽ định nghĩa lớp mới từ thư mục làm việc của Tomcat, vượt ra ngoài ranh giới mà môi trường chạy đã bảo vệ cho phép định nghĩa lớp.
Bạn có thể điều khiển rõ ràng:
--precompile-jsp
--no-precompile-jsp
Trong môi trường chạy thật, hãy giữ nguyên việc biên dịch trước. Tắt nó đi có thể khiến các trang của ứng dụng dùng JSP không tải được.
7. Phạm vi bảo vệ và quy tắc loại trừ
Mặc định các lớp ứng dụng dưới WEB-INF/classes được bảo vệ, còn WEB-INF/lib thì không. Các lớp hướng ra web có thể loại trừ:
p4j tomcat app.war dist \
--context /app \
--exclude 'com.example.web.**,com.example.dto.**'
Hãy loại trừ trước hết servlet, filter và listener, kèm theo DTO, lớp cấu hình, thực thể, lớp cầu nối JNI và mọi thứ mà vùng chứa cần bổ sung. Lượt quét tương thích sẽ đưa ra khuyến nghị an toàn.
8. Thêm ứng dụng khác vào cùng một gói Tomcat
p4j tomcat second.war dist \
--append-app \
--context /second
Ràng buộc:
- đường dẫn ngữ cảnh không được trùng với ứng dụng sẵn có;
- ứng dụng cũ và mới phải dùng cùng phiên bản chính của Tomcat, cùng phiên bản Java và cùng nền tảng mục tiêu;
- nếu không truyền
--append-app, công cụ sẽ từ chối ghi vào gói Tomcat sẵn có; - trên giao diện, hãy đánh dấu Thêm ứng dụng vào thư mục Tomcat hiện có rồi chọn thư mục đã tạo.
9. Lưu ý về Java 8
Với đích Java 8, lớp phủ ZIP được bật tự động để WebResourceSet của Tomcat mở được kho lưu trữ đã bảo vệ.