Spring/Spring MVC/iBATIS 應用 HTTP 到 HTTPS 遷移技術方案

Spring/Spring MVC/iBATIS 應用 HTTP 到 HTTPS 遷移技術方案

概述

本方案詳細介紹了將基于 Spring、Spring MVC 和 iBATIS 的傳統 Java Web 應用從 HTTP 遷移到 HTTPS 的完整流程。這種傳統架構的遷移需要考慮更多手動配置和兼容性問題。

一、環境評估與準備工作

1.1 當前環境分析

首先需要確認當前應用的技術棧和部署環境:

# 檢查當前應用的技術棧
- Spring Framework 版本: 3.x/4.x
- Spring MVC
- iBATIS 2.x (或早期 MyBatis)
- Servlet 容器: Tomcat 7.x/8.x
- Java 版本: 1.7/1.8
- 部署方式: WAR 包部署

1.2 遷移前檢查清單

  • 確認應用中沒有硬編碼的 HTTP URL
  • 檢查所有外部資源引用(CSS、JS、圖片等)
  • 確認第三方集成支持 HTTPS
  • 備份當前應用和配置文件
  • 準備回滾方案

二、證書獲取與配置

2.1 證書選擇與獲取

對于傳統應用,推薦使用 Java Keystore (JKS) 格式的證書:

# 使用 keytool 生成自簽名證書(僅用于測試)
keytool -genkeypair -alias tomcat -keyalg RSA -keysize 2048 \-keystore tomcat.keystore -validity 3650 \-dname "CN=yourdomain.com, OU=IT, O=YourCompany, L=City, ST=State, C=CN" \-storepass changeit -keypass changeit# 生產環境應使用正式證書,可從 CA 購買或使用 Let's Encrypt

2.2 證書轉換(如需要)

如果已有 PEM 格式證書,轉換為 JKS 格式:

# 將 PEM 轉換為 PKCS12
openssl pkcs12 -export -in certificate.pem -inkey private.key \-out certificate.p12 -name tomcat -CAfile ca_bundle.pem -caname root# 將 PKCS12 轉換為 JKS
keytool -importkeystore -deststorepass changeit -destkeypass changeit \-destkeystore tomcat.keystore -srckeystore certificate.p12 \-srcstoretype PKCS12 -srcstorepass changeit -alias tomcat

三、Tomcat 服務器配置

3.1 server.xml 配置

編輯 Tomcat 的 conf/server.xml 文件,添加或修改 Connector 配置:

<!-- 在server.xml中添加HTTPS連接器 -->
<Connector protocol="org.apache.coyote.http11.Http11NioProtocol"port="8443" maxThreads="200"scheme="https" secure="true" SSLEnabled="true"keystoreFile="${catalina.home}/conf/tomcat.keystore"keystorePass="changeit"clientAuth="false" sslProtocol="TLS"keyAlias="tomcat"ciphers="TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,TLS_RSA_WITH_AES_128_GCM_SHA256,TLS_RSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA"
/><!-- 配置HTTP連接器重定向到HTTPS -->
<Connector port="8080" protocol="HTTP/1.1"connectionTimeout="20000"redirectPort="8443" />

3.2 web.xml 配置

在應用的 WEB-INF/web.xml 中添加安全約束,強制使用 HTTPS:

<security-constraint><web-resource-collection><web-resource-name>Secure Content</web-resource-name><url-pattern>/*</url-pattern></web-resource-collection><user-data-constraint><transport-guarantee>CONFIDENTIAL</transport-guarantee></user-data-constraint>
</security-constraint>

四、應用層配置調整

4.1 Spring 配置更新

在 Spring 配置文件中確保應用正確處理 HTTPS:

<!-- 在applicationContext.xml或相關配置文件中 -->
<bean id="forceHttpsFilter" class="com.yourcompany.filters.ForceHttpsFilter"/><bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"><property name="webBindingInitializer"><bean class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer"><property name="validator" ref="validator"/></bean></property><!-- 確保URL生成使用HTTPS --><property name="messageConverters"><list><ref bean="mappingJacksonHttpMessageConverter"/></list></property>
</bean>

4.2 自定義 HTTPS 過濾器

創建自定義過濾器處理 HTTPS 重定向和協議頭:

package com.yourcompany.filters;import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;public class ForceHttpsFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {// 初始化代碼}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {HttpServletRequest httpRequest = (HttpServletRequest) request;HttpServletResponse httpResponse = (HttpServletResponse) response;// 檢查是否已經是HTTPSif (!httpRequest.isSecure()) {String requestURL = httpRequest.getRequestURL().toString();String redirectURL = requestURL.replaceFirst("http", "https").replaceFirst(":8080", ":8443");httpResponse.sendRedirect(redirectURL);return;}// 設置響應頭增強安全性httpResponse.setHeader("Strict-Transport-Security", "max-age=31536000; includeSubDomains");httpResponse.setHeader("X-Content-Type-Options", "nosniff");httpResponse.setHeader("X-Frame-Options", "DENY");httpResponse.setHeader("X-XSS-Protection", "1; mode=block");chain.doFilter(request, response);}@Overridepublic void destroy() {// 清理代碼}
}

4.3 更新所有硬編碼的 HTTP URL

檢查并更新代碼中所有硬編碼的 HTTP URL:

// 在屬性文件或配置類中定義基礎URL
public class AppConfig {public static final String BASE_URL = "https://yourdomain.com:8443";// 或者從配置文件讀取@Value("${app.baseUrl}")private String baseUrl;
}// 使用配置的URL而不是硬編碼
String apiUrl = AppConfig.BASE_URL + "/api/endpoint";

五、iBATIS/SQL Map 配置檢查

確保 iBATIS 配置中沒有硬編碼的 HTTP URL:

<!-- 檢查iBATIS配置文件中的任何URL引用 -->
<select id="getExternalData" parameterClass="java.lang.String" resultClass="java.util.HashMap"><!-- 確保沒有硬編碼的HTTP URL -->SELECT * FROM external_services WHERE protocol = 'https'
</select>

六、前端資源調整

6.1 更新所有資源引用

確保所有前端資源使用協議相對URL或HTTPS URL:

<%-- 在JSP頁面中 --%>
<!-- 使用協議相對URL -->
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<!-- 或直接使用HTTPS -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">

6.2 處理混合內容問題

添加內容安全策略頭防止混合內容:

// 在過濾器或攔截器中添加
response.setHeader("Content-Security-Policy", "default-src 'self' https:; " +"img-src 'self' https: data:; " +"script-src 'self' https: 'unsafe-inline' 'unsafe-eval'; " +"style-src 'self' https: 'unsafe-inline'");

七、部署與測試

7.1 部署流程

  1. 備份當前應用和配置
  2. 將證書文件復制到 Tomcat 的 conf 目錄
  3. 更新 server.xml 和 web.xml 配置
  4. 重新打包應用(如果需要更新代碼)
  5. 部署應用到測試環境
  6. 重啟 Tomcat 服務器

7.2 測試驗證

創建全面的測試計劃:

# 使用OpenSSL測試SSL連接
openssl s_client -connect yourdomain.com:8443 -servername yourdomain.com# 使用curl測試重定向
curl -I http://yourdomain.com:8080
# 應該返回301/302重定向到HTTPS# 測試HTTPS連接
curl -k https://yourdomain.com:8443

測試用例應包括:

  • HTTP 到 HTTPS 的重定向
  • 所有主要功能在 HTTPS 下的可用性
  • 靜態資源加載(無混合內容警告)
  • 表單提交和數據傳輸
  • 會話保持和Cookie安全
  • 第三方集成功能

八、監控與維護

8.1 日志配置

增強日志記錄以監控SSL相關問題:

<!-- 在log4j.properties或logback.xml中 -->
<logger name="org.apache.coyote.http11" level="DEBUG"/>
<logger name="org.apache.tomcat.util.net" level="INFO"/>

8.2 證書維護

設置證書過期提醒和續訂流程:

# 檢查證書過期日期
keytool -list -v -keystore tomcat.keystore | grep -i valid# 設置定期檢查任務(crontab)
0 0 1 * * /path/to/check_cert_expiry.sh

九、回滾方案

如果遷移遇到問題,按以下步驟回滾:

  1. 恢復原來的 server.xml 配置
  2. 移除 web.xml 中的安全約束
  3. 恢復應用代碼中的URL引用
  4. 重啟 Tomcat 服務器
  5. 驗證應用恢復正常HTTP訪問

十、常見問題與解決方案

10.1 會話丟失問題

HTTPS 和 HTTP 的會話可能不共享,需要確保會話連續性:

// 在應用初始化時設置Cookie為安全
Cookie cookie = new Cookie("JSESSIONID", sessionId);
cookie.setSecure(true);
cookie.setHttpOnly(true);
response.addCookie(cookie);

10.2 性能考慮

SSL/TLS 加密會增加服務器負載,考慮:

  1. 啟用 TLS 會話恢復
  2. 使用更高效的加密算法
  3. 考慮硬件SSL加速(如需要)

10.3 兼容性問題

確保所有客戶端和瀏覽器支持使用的加密算法:

<!-- 在server.xml中配置兼容的加密套件 -->
<Connectorciphers="TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,TLS_RSA_WITH_AES_128_GCM_SHA256,TLS_RSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA"
/>

總結

將傳統 Spring/Spring MVC/iBATIS 應用從 HTTP 遷移到 HTTPS 需要以下關鍵步驟:

  1. 證書準備 - 獲取并配置合適的 SSL 證書
  2. 服務器配置 - 修改 Tomcat 的 server.xml 和應用的 web.xml
  3. 應用層調整 - 更新代碼中的 URL 引用,添加安全過濾器
  4. 前端資源處理 - 確保所有資源使用 HTTPS 或協議相對 URL
  5. 全面測試 - 驗證功能正常且無混合內容問題
  6. 監控維護 - 設置證書過期監控和性能監控

與傳統 Spring Boot 應用相比,這種架構的遷移需要更多手動配置,但通過系統化的方法可以確保平穩過渡。務必在生產環境部署前進行充分的測試,并準備好回滾方案。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/95254.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/95254.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/95254.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

多智能體系統設計:5種編排模式解決復雜AI任務

當你有一個由研究員、文案、數據分析師和質檢員組成的團隊時&#xff0c;如果沒有合理的協調機制&#xff0c;再優秀的個體也可能產生沖突的結論、停滯的流程&#xff0c;或者解決錯誤的問題。AI智能體同樣如此。 隨著系統從單體模型向多智能體架構演進&#xff0c;編排成為核…

CVPR上的多模態檢索+視頻理解,LLM助力提效翻倍

關注gongzhongaho【CVPR頂會精選】多模態研究正處在爆發期&#xff0c;從圖文融合到視頻、語音、傳感器數據&#xff0c;模型能力邊界不斷擴展。頂會頂刊已將其視為具身智能與通用AI的核心方向。但寫論文時常遇到痛點&#xff1a;方法多、任務雜&#xff0c;缺乏統一框架&#…

Docker部署單節點使用KRaft模式的Kafka3.8.0版本與可視化界面Kafka-Map

記錄一下Docker部署單節點Kafka與部署可視化界面KafkaMap容器 目錄 一、Kafka早已經棄用了ZooKeeper 二、Docker部署單機版Kafka 1、--name kafka-server 2、--network kafka-stand 3、--restart unless-stopped 4、-p 9092:9092 5、-p 9093:9093 6、-e ALLOW_PLAINTE…

Elasticsearch面試精講 Day 2:索引、文檔與映射機制

【Elasticsearch面試精講 Day 2】索引、文檔與映射機制 在“Elasticsearch面試精講”系列的第二天&#xff0c;我們將深入探討索引&#xff08;Index&#xff09;、文檔&#xff08;Document&#xff09;與映射&#xff08;Mapping&#xff09;機制。這是Elasticsearch中最基礎…

Vue2 與 Vue3 路由鉤子的區別及用法詳解

Vue2 與 Vue3 路由鉤子的區別及用法詳解 一、核心區別概覽特性Vue2 (選項式API)Vue3 (組合式API)定義方式組件選項形式在setup()中調用函數形式鉤子名稱beforeRouteEnter/Update/LeaveonBeforeRouteUpdate/Leavethis訪問beforeRouteEnter不能訪問this無this概念&#xff0c;直接…

STM32的內存分配與堆棧

使用過cortex-M4內核單片機的朋友對下面這張圖一定不會感到陌生&#xff0c;它是ST原廠手冊里面的memory map&#xff0c;里面的信息量其實非常多&#xff0c;今天簡單說明一部分。我們在編寫stm32代碼的時候最長使用的地址有兩塊&#xff0c;第一塊是0x0000 0000~0x3FFF FFFF,…

OpenStack 03:創建實例

修改默認安全組 管理規則 添加規則 添加端口22規則 添加ping 規則 下載鏡像文件 Get images — Virtual Machine Image Guide documentation https://mirrors.tuna.tsinghua.edu.cn/fedora/releases/42/Cloud/x86_64/images/Fedora-Cloud-Base-Generic-42-1.1.x86_64.qcow2 …

企業級架構師綜合能力項目案例一(各種組件集群搭建+SpringBoot整合)

架構圖 用戶請求 → Nginx → Spring Cloud Gateway → 微服務集群↓MySQL集群主從復制(ShardingSphere) Redis集群主從復制(Sentinel)ES集群 MongoDB集群(分片)RocketMQ集群 Seata分布式事務搭建集群 Nginx集群和配置┌─────────…

學習stm32 窗口看門狗

窗口看門狗1.WWDG簡介窗口看門狗用于監測單片機程序運行時效是否精準&#xff0c;主要檢測軟件異常&#xff0c;一般用于需要精準檢測程序運行時間的場合。不僅防止程序 “卡死不喂狗”&#xff0c;還能避免程序 “異常早喂狗”&#xff08;如死循環中誤執行喂狗指令&#xff0…

Selenium 等待機制:編寫穩定可靠的自動化腳本

一、為什么需要等待機制&#xff1f;網頁是動態加載的&#xff0c;元素出現的時間不確定。如果腳本在元素還沒加載完成時就嘗試操作它&#xff0c;就會拋出 NoSuchElementException 異常。三種等待方式&#xff1a;強制等待&#xff1a;time.sleep() - 簡單但低效隱式等待&…

蓓韻安禧活性葉酸獨立包裝防漏貼心設計

蓓韻安禧葉酸新升級 近期&#xff0c;蓓韻安禧在葉酸產品上進行了重要的優化升級。這次升級的核心在于產品形態和使用體驗的顯著提升&#xff0c;尤其體現在其包裝設計上。新版本采用了獨立密封的小包裝形式&#xff0c;每一份都精準包含每日所需的葉酸量。這種設計不僅有效避免…

8針腳的1.8寸IIC接口的TFT彩屏的八個引腳都需要使用嗎?

核心結論 不需要全部使用8個引腳。實際僅需連接 4根核心線&#xff08;GND, VCC, SCL, SDA&#xff09; 即可基本工作&#xff0c;其余引腳為功能增強或備用設計。具體需根據屏幕型號確認&#xff0c;但通用規則如下&#xff1a;8針腳功能分解引腳標號典型名稱是否必需作用不連…

刷題日記0831

今日計劃5道早上起來不困&#xff0c;吃好早飯開始困了&#xff0c;感覺刷不動題&#xff0c;就先做別的事&#xff0c;不困。現在別的事做好了&#xff0c;感覺能刷動題了。開始開始。7/5134. 加油站 中等超時了。看下題解。不是&#xff0c;怎么上數學了&#xff1f;假設從 x…

【2025.8.31】自學Java三個月,談談心路歷程順便給自己灌點雞湯

自學Java三個月&#xff0c;談談心得順便給自己灌點雞湯 6月1開始上班&#xff0c;到今天剛好三個月。從上班第一天決定開始自學java&#xff0c;到今天也是正好3個月整&#xff0c;想借這個機會簡單記錄一下學習java的契機和進度&#xff0c;α一些碎碎念。&#xff08;括號恐…

linux內核trace_begin和trace_end使用分析

1,strace/ftrace的實現和使用 echo 1 > /sys/kernel/debug/tracing/tracing_on echo function > /sys/kernel/debug/tracing/current_tracer 2, 手動插入追蹤點 在內核代碼中,可以使用trace_printk函數手動插入追蹤點,標記代碼段的開始和結束: trace_printk(&…

Linux-驅動積累

Linux 設備驅動概述?Linux 設備驅動是內核與硬件交互的核心橋梁&#xff0c;負責屏蔽硬件細節、提供統一操作接口。其以內核模塊為主要存在形式&#xff0c;支持動態加載 / 卸載&#xff0c;核心功能涵蓋硬件初始化、中斷處理、電源管理及數據傳輸&#xff0c;是嵌入式 Linux …

軟考-系統架構設計師 決策支持系統(DSS)詳細講解

個人博客&#xff1a;blogs.wurp.top 一、DSS的核心概念與定位 1. 什么是DSS&#xff1f; DSS是一個交互式的、計算機化的系統&#xff0c;旨在幫助決策者利用數據和模型來解決半結構化&#xff08;Semi-structured&#xff09; 或非結構化&#xff08;Non-structured&#…

《Python 實戰:構建一個可擴展的訂單管理系統,從基礎操作到架構思維》

《Python 實戰:構建一個可擴展的訂單管理系統,從基礎操作到架構思維》 一、引言:用代碼管理商業的脈搏 在數字化浪潮席卷各行各業的今天,訂單管理系統已成為電商、物流、零售等領域的核心支撐。它不僅承載著交易數據,更是企業運營效率的體現。而 Python,以其簡潔優雅的…

【計算機網絡】生產問題排查:如何使用Wireshark抓包/讀取抓包文件進行網絡分析

1 緣起 有一次,公司同事A讓同事B看一次請求日志, 同事B說先抓一次包看看請求是否進入服務器-某個服務, 我知道這個事情后,也“參觀”了抓包過程, 上面的事件只是一個小插曲,緊接著的第二件事才是寫本篇文章的真正動機: 同一天,同事C讓同事D配置個服務代理(某種上網方…

網格dp|

lc3665class Solution {public:int uniquePaths(vector<vector<int>>& grid) {const int MOD 1000000007;int m grid.size(), n grid[0].size();vector memo(m, vector(n, array<int, 2>{-1, -1})); // -1 表示沒有計算過auto dfs [&](this auto…