tomcat8.5原始碼構建
專案原始碼構建
下載原始碼
git clone https://gitee.com/mirrors/tomcat.git
cd tomcat
# 切換分支
# git checkout -b "tomcat7.0" origin/7.0.x
git checkout -b "tomcat8.5" origin/8.5.x
匯入到IDEA中
新增pom檔案
新增pom.xml到專案根目錄
<?xml version="1.0" encoding="utf-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.apache.tomcat</groupId>
<artifactId>Tomcat8.5</artifactId>
<name>Tomcat8.5</name>
<version>8.5</version>
<build>
<finalName>Tomcat8.5</finalName>
<!-- 指定原始檔為java 、test -->
<sourceDirectory>java</sourceDirectory>
<testSourceDirectory>test</testSourceDirectory>
<resources>
<resource>
<directory>java</directory>
</resource>
</resources>
<testResources>
<testResource>
<directory>test</directory>
</testResource>
</testResources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3</version>
<configuration>
<encoding>UTF-8</encoding>
<!-- 指定jdk 編譯 版本 ,沒裝jdk 1.7的可以變更為1.6 -->
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
<!-- 新增tomcat8 所需jar包依賴 -->
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>ant</groupId>
<artifactId>ant</artifactId>
<version>1.7.0</version>
</dependency>
<dependency>
<groupId>wsdl4j</groupId>
<artifactId>wsdl4j</artifactId>
<version>1.6.2</version>
</dependency>
<dependency>
<groupId>javax.xml</groupId>
<artifactId>jaxrpc</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>org.easymock</groupId>
<artifactId>easymock</artifactId>
<version>3.3</version>
</dependency>
<dependency>
<groupId>org.eclipse.jdt.core.compiler</groupId>
<artifactId>ecj</artifactId>
<version>4.6.1</version>
</dependency>
</dependencies>
</project>
新增CookieFilter.java
在tomcat/test/util下新增CookieFilter.java
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package util;
import java.util.Locale;
import java.util.StringTokenizer;
/**
* Processes a cookie header and attempts to obfuscate any cookie values that
* represent session IDs from other web applications. Since session cookie names
* are configurable, as are session ID lengths, this filter is not expected to
* be 100% effective.
*
* It is required that the examples web application is removed in security
* conscious environments as documented in the Security How-To. This filter is
* intended to reduce the impact of failing to follow that advice. A failure by
* this filter to obfuscate a session ID or similar value is not a security
* vulnerability. In such instances the vulnerability is the failure to remove
* the examples web application.
*/
public class CookieFilter {
private static final String OBFUSCATED = "[obfuscated]";
private CookieFilter() {
// Hide default constructor
}
public static String filter(String cookieHeader, String sessionId) {
StringBuilder sb = new StringBuilder(cookieHeader.length());
// Cookie name value pairs are ';' separated.
// Session IDs don't use ; in the value so don't worry about quoted
// values that contain ;
StringTokenizer st = new StringTokenizer(cookieHeader, ";");
boolean first = true;
while (st.hasMoreTokens()) {
if (first) {
first = false;
} else {
sb.append(';');
}
sb.append(filterNameValuePair(st.nextToken(), sessionId));
}
return sb.toString();
}
private static String filterNameValuePair(String input, String sessionId) {
int i = input.indexOf('=');
if (i == -1) {
return input;
}
String name = input.substring(0, i);
String value = input.substring(i + 1, input.length());
return name + "=" + filter(name, value, sessionId);
}
public static String filter(String cookieName, String cookieValue, String sessionId) {
if (cookieName.toLowerCase(Locale.ENGLISH).contains("jsessionid") &&
(sessionId == null || !cookieValue.contains(sessionId))) {
cookieValue = OBFUSCATED;
}
return cookieValue;
}
}
修改MANIFEST.MF檔案
錯誤:
Error:osgi: [tomcat] Invalid value for Bundle-Version, @VERSION@ does not match [0-9]{1,9}(\.[0-9]{1,9}(\.[0-9]{1,9}(\.[0-9A-Za-z_-]+)?)?)?
解決
修改MANIFEST.MF檔案中所有@VERSION@為1.1
啟動項配置VM引數
路徑為tomcat原始碼專案的絕對地址
-Dcatalina.home=/Users/xianghan/work/github/tomcat
-Dcatalina.base=/Users/xianghan/work/github/tomcat
-Djava.endorsed.dirs=/Users/xianghan/work/github/tomcat/endorsed
-Djava.io.tmpdir=/Users/xianghan/work/github/tomcat/temp
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
-Djava.util.logging.config.file=/Users/xianghan/work/github/tomcat/conf/logging.properties
執行Bootstrap
run Bootstrap main()
相關文章
- 【Tomcat 原始碼系列】原始碼構建 TomcatTomcat原始碼
- gradle構建spring原始碼GradleSpring原始碼
- Vue.js 原始碼構建Vue.js原始碼
- AvaloniaChat—從原始碼構建指南原始碼
- Flutter原始碼剖析(一):原始碼獲取與構建Flutter原始碼
- 使用 Docker 構建 Nebula Graph 原始碼Docker原始碼
- Vue原始碼: 建構函式入口Vue原始碼函式
- 從原始碼構建docker-ce原始碼Docker
- vue原始碼解讀-建構函式Vue原始碼函式
- SpringSecurity 原始碼分析之SecurityFilterchain的構建SpringGse原始碼FilterAI
- Mybatis原始碼簡單解讀----構建MyBatis原始碼
- 從原始碼構建TensorFlow流程記錄原始碼
- Vue原始碼探究-構建版本的區別Vue原始碼
- 如何在Windows上從原始碼構建OpenJFX 8Windows原始碼
- Android 原始碼分析(一)專案構建過程Android原始碼
- Vue.js原始碼解析-從scripts指令碼看vue構建Vue.js原始碼指令碼
- 使用JHipster構建Spring和React構建電子商務應用程式原始碼 -DEVSpringReact原始碼dev
- Laravel 原始碼閱讀指南 -- Database 查詢構建器Laravel原始碼Database
- 使用Deno和WebSockets構建實時聊天原始碼案例Web原始碼
- 深入Vue - 原始碼目錄及構建過程分析Vue原始碼
- Elasticsearch6.1.2原始碼下載和編譯構建Elasticsearch原始碼編譯
- 修改gradle指令碼,加速spring4.1原始碼編譯構建速度Gradle指令碼Spring原始碼編譯
- Magic原始碼閱讀(三)——資料匯入和構建原始碼
- 深入剖析Vue原始碼 - 響應式系統構建(中)Vue原始碼
- 深入剖析Vue原始碼 - 響應式系統構建(上)Vue原始碼
- 深入剖析Vue原始碼 - 響應式系統構建(下)Vue原始碼
- Vite 原始碼解讀系列(圖文結合) —— 構建篇Vite原始碼
- 原始碼解析.Net中Host主機的構建過程原始碼
- 元宇宙的系統原始碼構建、遊戲開發元宇宙原始碼遊戲開發
- vue 原始碼學習(一) 目錄結構和構建過程簡介Vue原始碼
- 人人都能懂的Vue原始碼系列(二)—Vue建構函式Vue原始碼函式
- windows下修改、編譯、構建spring-framework4.1.8.RELEASE原始碼Windows編譯SpringFramework原始碼
- 元宇宙NFT系統開發(現成原始碼,快速構建)元宇宙原始碼
- ElementUI 原始碼簡析——原始碼結構篇UI原始碼
- [原始碼解析] PyTorch 分散式(11) ----- DistributedDataParallel 之 構建Reducer和Join操作原始碼PyTorch分散式Parallel
- 從原始碼構建一個極簡的Linux作業系統原始碼Linux作業系統
- JMeter5.4.1原始碼IDEA構建&二次開發(實戰)JMeter原始碼Idea
- Langchain-ChatGLM原始碼解讀(二)-文件embedding以及構建faiss過程LangChain原始碼