SpringBoot中的server.context-path的實現(xiàn)
一、問題引入
SpringBoot 在 idea中的 .idea和 .iml文件,我在boot-test的測試項目中使用的 SpringBoot版本為 1.3.5.RELEASE,新項目 cps-task中使用的版本為 2.4.8,造成了連接異常,問題很好解決,但涉及的bug記錄一下。
首先,先看一張圖片

二、代碼片段展示
2.1.接口層
package com.bt.controller;
import com.bt.config.DataConfig;
import com.bt.service.ReconciliationService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@Slf4j
@Controller
public class ReconciliationController implements DataConfig {
@Resource
private ReconciliationService reconciliationService;
@RequestMapping(value = "/api/cib", method = RequestMethod.GET)
@ResponseBody
public String cibReconciliation(HttpServletRequest request){
String date = request.getParameter("date");
if(date == null){
return "date is null";
}
Pattern pattern = Pattern.compile(DATE_PATTERN);
Matcher matcher = pattern.matcher(date);
if (!matcher.matches()) {
// 不輸入符合預期的格式,進行下一步操作
return "The format of 'date' is illegal!";
}
log.info("執(zhí)行對賬開始!!");
reconciliationService.checkBillForReconciliation(BANK_ID_CIB, date);
return "ok";
}
}
2.2.application.properties
server.port=8899 server.context-path=/cps-task/
三、問題分析
3.1.server.context-path 作用
在Spring Boot項目中,server.context-path 屬性用于設置應用程序的上下文路徑(context path),這樣應用就不會直接部署在根路徑(/)下,而是部署在指定的路徑下。然而,需要注意的是,從Spring Boot 2.0開始,server.context-path 屬性已經(jīng)被棄用,并被 server.servlet.context-path 所替代。
我這里在 2.4.8 的高版本中,使用了低版本的參數(shù),造成參數(shù)未生效,所以,出現(xiàn)了404連接異常。
3.2.正確展示
對于Spring Boot 1.x版本,你可以在你的application.properties或application.yml文件中這樣設置:
application.properties
server.context-path=/cps-task/
對于Spring Boot 2.x及更高版本,application.properties 文件應該這樣設置:
server.servlet.context-path=/cps-task/
而application.yml 的YAML格式的配置文件,應該這樣設置:
# application.yml
server:
servlet:
context-path: /cps-task/四、HTTP請求響應碼簡介
4.1.響應碼參考來源
java.net.HttpURLConnection;
4.2.源碼示例
4.2.1.源碼總述
HTTP的響應代碼,從1.1版本開始。
/**
* The response codes for HTTP, as of version 1.1.
*/
// REMIND: do we want all these??
// Others not here that we do want??4.2.2.正常情況——2XX: generally "OK"
/* 2XX: generally "OK" */
/**
* HTTP Status-Code 200: OK.
*/
public static final int HTTP_OK = 200;
/**
* HTTP Status-Code 201: Created.
*/
public static final int HTTP_CREATED = 201;
/**
* HTTP Status-Code 202: Accepted.
*/
public static final int HTTP_ACCEPTED = 202;
/**
* HTTP Status-Code 203: Non-Authoritative Information.
*/
public static final int HTTP_NOT_AUTHORITATIVE = 203;
/**
* HTTP Status-Code 204: No Content.
*/
public static final int HTTP_NO_CONTENT = 204;
/**
* HTTP Status-Code 205: Reset Content.
*/
public static final int HTTP_RESET = 205;
/**
* HTTP Status-Code 206: Partial Content.
*/
public static final int HTTP_PARTIAL = 206;
4.2.3.重定位/重定向——3XX: relocation/redirect
4.2.3.1.300: Multiple Choices.
Multiple Choices指當服務器接收到一個請求,并且該請求可以通過多種不同的方式或資源來滿足時,服務器可能會返回300 Multiple Choices狀態(tài)碼。這意味著服務器提供了多個可能的響應,但由客戶端來決定選擇哪一個。
當客戶端收到300 Multiple Choices狀態(tài)碼時,它應該顯示一個包含所有可能響應選項的用戶界面,讓用戶選擇一個。然而,由于這個過程可能比較復雜且用戶體驗不佳,因此很少有網(wǎng)站會這樣做。
/**
* HTTP Status-Code 300: Multiple Choices.
*/
public static final int HTTP_MULT_CHOICE = 300;4.2.3.2.301: Moved Permanently.
Moved Permanently,是一個HTTP響應狀態(tài)碼,表示請求的資源已經(jīng)被永久地移動到了由Location頭部所指示的URL上。這是一個重定向狀態(tài)碼,它告訴客戶端(如瀏覽器)自動地訪問新的URL。
特點:
- 永久性:301狀態(tài)碼表示的是永久性的重定向,意味著資源已經(jīng)不再存在于請求的URL上,而是永久地遷移到了新的位置。
- 搜索引擎優(yōu)化(SEO):對于搜索引擎優(yōu)化(SEO)來說,301重定向是一個重要的工具。當網(wǎng)站的結(jié)構(gòu)發(fā)生變化,或者網(wǎng)頁的URL發(fā)生更改時,使用301重定向可以幫助搜索引擎將舊URL的排名和權(quán)重轉(zhuǎn)移到新URL上。
- 緩存:由于這是一個永久性的重定向,客戶端(如瀏覽器)和中間緩存(如CDN)可能會緩存這個重定向信息,以便將來對相同資源的請求能夠直接訪問新的URL。
使用場景:
- 當網(wǎng)站的URL結(jié)構(gòu)發(fā)生變化,但內(nèi)容仍然需要被訪問時。
- 當網(wǎng)站遷移到新的域名或子域名時。
- 當需要將網(wǎng)站的某個部分或頁面重命名或重新組織時。
/**
* HTTP Status-Code 301: Moved Permanently.
*/
public static final int HTTP_MOVED_PERM = 301;
4.2.3.3.302: Temporary Redirect.
Temporary Redirect,是一種HTTP重定向狀態(tài)碼,用于指示客戶端發(fā)送的請求需要進一步重定向到另一個URL,但這次重定向是臨時的。與301 Moved Permanently(永久重定向)不同,307 Temporary Redirect表明資源的移動是暫時的,客戶端在將來可能會再次嘗試訪問原始URL。
特點:
- 保持請求方法:與其他重定向狀態(tài)碼(如302 Found)不同,307 Temporary Redirect要求客戶端在重定向時保持原始請求的方法(如GET、POST等)不變。這意味著,如果原始請求是POST請求,重定向后的請求也應該是POST請求,而不是自動轉(zhuǎn)換為GET請求。
- 臨時性:307狀態(tài)碼表明資源的重定向是臨時的,可能由于網(wǎng)站維護、服務器負載平衡或URL結(jié)構(gòu)臨時更改等原因?qū)е???蛻舳藨摾^續(xù)嘗試訪問原始URL,直到服務器通知其更改已變?yōu)橛谰谩?/li>
使用場景:
- 網(wǎng)站維護:當網(wǎng)站正在進行臨時維護時,服務器可能會將用戶的請求重定向到一個備份服務器或維護頁面,以避免服務中斷。
- URL結(jié)構(gòu)更改:在網(wǎng)站重構(gòu)或升級過程中,可能需要臨時更改URL結(jié)構(gòu)。使用307 Temporary Redirect可以確保在更改過程中,用戶仍然能夠訪問網(wǎng)站資源。
- 負載均衡:在分布式系統(tǒng)中,服務器可能會根據(jù)當前負載情況將請求重定向到不同的服務器。使用307 Temporary Redirect可以確保這種重定向是臨時的,并且請求方法保持不變。
/**
* HTTP Status-Code 302: Temporary Redirect.
*/
public static final int HTTP_MOVED_TEMP = 302;
4.2.3.4.303: See Other.
See Other,是一個HTTP重定向狀態(tài)碼,用于指示客戶端使用GET方法向另一個URI(統(tǒng)一資源標識符)發(fā)送請求,以獲取請求的資源。以下是關于303 See Other的詳細解釋:
- 定義:303 See Other狀態(tài)碼表示客戶端應使用GET方法定向獲取請求的資源。這通常發(fā)生在客戶端最初使用POST方法發(fā)送請求,但服務器希望客戶端通過GET方法訪問資源的另一個URI時。
- 特點:
- 重定向:與301 Moved Permanently和302 Found類似,303 See Other也是一種重定向狀態(tài)碼,但它明確要求客戶端使用GET方法訪問新的URI。
- 方法改變:與307 Temporary Redirect不同,303 See Other允許客戶端在重定向時改變請求方法,從POST(或其他方法)變?yōu)镚ET。
使用場景:
- 當客戶端使用POST方法提交表單,但服務器希望將用戶重定向到一個新的頁面以顯示結(jié)果或進行進一步操作時,可以使用303 See Other狀態(tài)碼。
- 在某些Web應用程序中,為了防止表單的重復提交,服務器可能會在處理完POST請求后,使用303 See Other將客戶端重定向到一個新的GET請求頁面。
/**
* HTTP Status-Code 303: See Other.
*/
public static final int HTTP_SEE_OTHER = 303;4.2.3.5.304: Not Modified.
Not Modified,是一個HTTP響應狀態(tài)碼,用于指示客戶端請求的資源自上次請求后沒有發(fā)生改變,因此客戶端可以繼續(xù)使用其緩存的版本,而無需重新下載資源。以下是關于304 Not Modified的詳細解釋:
定義與特點:
定義:304 Not Modified狀態(tài)碼表示客戶端請求的資源自上次請求以來沒有發(fā)生修改,客戶端可以使用其緩存的版本。
特點:
- 節(jié)省帶寬:通過避免不必要的資源下載,可以顯著減少網(wǎng)絡帶寬的使用。
- 提升性能:減少服務器負載,加快頁面加載速度,提升用戶體驗。
- 依賴緩存驗證:該狀態(tài)碼通常與緩存驗證機制(如ETag或Last-Modified頭部)一起使用,以確保資源的最新性。
使用場景:
- 當客戶端(如瀏覽器)已經(jīng)緩存了某個資源,并且該資源在服務器上未發(fā)生更改時,服務器會返回304 Not Modified狀態(tài)碼。
- 客戶端在發(fā)送請求時,通常會包含一些條件請求頭部(如If-Modified-Since或If-None-Match),以告訴服務器它已經(jīng)擁有的資源版本信息。
- 服務器在收到這些條件請求頭部后,會檢查請求的資源是否自上次請求以來有所更改。如果沒有更改,服務器就會返回304狀態(tài)碼,并且不會發(fā)送資源的內(nèi)容。
/**
* HTTP Status-Code 304: Not Modified.
*/
public static final int HTTP_NOT_MODIFIED = 304;4.2.3.6.305: Use Proxy.
Use Proxy(使用代理)是一個常見的配置或行為,它涉及到通過代理服務器來轉(zhuǎn)發(fā)HTTP請求和響應。代理服務器的作用
- 提高訪問速度:代理服務器可以緩存客戶請求的數(shù)據(jù)。當多個客戶請求相同的數(shù)據(jù)時,代理服務器可以直接從緩存中提供數(shù)據(jù),而無需再次從原始服務器獲取,從而提高了訪問速度。
- 防火墻和安全:代理服務器可以作為防火墻,限制或過濾用戶對某些網(wǎng)站的訪問。這有助于保護網(wǎng)絡免受惡意軟件的攻擊,并提高用戶的安全性。
- 訪問限制資源:在某些情況下,用戶可能無法直接訪問某些網(wǎng)站或服務。通過代理服務器,用戶可以繞過這些限制,訪問被限制的資源。
- 隱藏用戶身份:使用代理服務器時,外部服務器只能看到代理服務器的IP地址,而無法看到用戶的真實IP地址,從而增強了用戶的匿名性。
/**
* HTTP Status-Code 305: Use Proxy.
*/
public static final int HTTP_USE_PROXY = 305;4.2.4.連接錯誤——4XX: client error
/**
* HTTP Status-Code 400: Bad Request.
*/
public static final int HTTP_BAD_REQUEST = 400;
/**
* HTTP Status-Code 401: Unauthorized.
*/
public static final int HTTP_UNAUTHORIZED = 401;
/**
* HTTP Status-Code 402: Payment Required.
*/
public static final int HTTP_PAYMENT_REQUIRED = 402;
/**
* HTTP Status-Code 403: Forbidden.
*/
public static final int HTTP_FORBIDDEN = 403;
/**
* HTTP Status-Code 404: Not Found.
*/
public static final int HTTP_NOT_FOUND = 404;
/**
* HTTP Status-Code 405: Method Not Allowed.
* 方法不允許。例如,后端接口要求用Get請求,前段用Post請求
*/
public static final int HTTP_BAD_METHOD = 405;
/**
* HTTP Status-Code 406: Not Acceptable.
*/
public static final int HTTP_NOT_ACCEPTABLE = 406;
/**
* HTTP Status-Code 407: Proxy Authentication Required.
*/
public static final int HTTP_PROXY_AUTH = 407;
/**
* HTTP Status-Code 408: Request Time-Out.
*/
public static final int HTTP_CLIENT_TIMEOUT = 408;
/**
* HTTP Status-Code 409: Conflict.
*/
public static final int HTTP_CONFLICT = 409;
/**
* HTTP Status-Code 410: Gone.
*/
public static final int HTTP_GONE = 410;
/**
* HTTP Status-Code 411: Length Required.
*/
public static final int HTTP_LENGTH_REQUIRED = 411;
/**
* HTTP Status-Code 412: Precondition Failed.
*/
public static final int HTTP_PRECON_FAILED = 412;
/**
* HTTP Status-Code 413: Request Entity Too Large.
*/
public static final int HTTP_ENTITY_TOO_LARGE = 413;
/**
* HTTP Status-Code 414: Request-URI Too Large.
*/
public static final int HTTP_REQ_TOO_LONG = 414;
/**
* HTTP Status-Code 415: Unsupported Media Type.
*/
public static final int HTTP_UNSUPPORTED_TYPE = 415;
4.2.5.服務錯誤——5XX: server error
/**
* HTTP Status-Code 500: Internal Server Error.
* @deprecated it is misplaced and shouldn't have existed.
* 內(nèi)部服務器錯誤,它放錯地方了,不應該存在。
* (存在爭議,不太確定是HTTP_SERVER_ERROR不應該存在,還是@Deprecated不應該存在)
*/
@Deprecated
public static final int HTTP_SERVER_ERROR = 500;
/**
* HTTP Status-Code 500: Internal Server Error.
* 內(nèi)部服務器錯誤。
*/
public static final int HTTP_INTERNAL_ERROR = 500;
/**
* HTTP Status-Code 501: Not Implemented.
*/
public static final int HTTP_NOT_IMPLEMENTED = 501;
/**
* HTTP Status-Code 502: Bad Gateway.
* 網(wǎng)關錯誤。
*/
public static final int HTTP_BAD_GATEWAY = 502;
/**
* HTTP Status-Code 503: Service Unavailable.
* 服務不可用
*/
public static final int HTTP_UNAVAILABLE = 503;
/**
* HTTP Status-Code 504: Gateway Timeout.
* 網(wǎng)關超時。
*/
public static final int HTTP_GATEWAY_TIMEOUT = 504;
/**
* HTTP Status-Code 505: HTTP Version Not Supported.
* 不支持HTTP版本。
*/
public static final int HTTP_VERSION = 505;到此這篇關于SpringBoot中的server.context-path的實現(xiàn)的文章就介紹到這了,更多相關SpringBoot server.context-path內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- springboot整合websocket后啟動報錯(javax.websocket.server.ServerContainer not available)
- SpringBoot服務設置禁止server.point端口的使用
- springboot中server.ssl.key-store配置路徑的問題小結(jié)
- 使用Java和SpringBoot實現(xiàn)服務器發(fā)送事件(Server-Sent Events)
- SpringBoot實現(xiàn)Server-Sent Events(SSE)的使用完整指南
- SpringBoot開啟server:compression:enabled(Illegal character ((CTRL-CHAR, code 31)))的問題解決
相關文章
基于序列化存取實現(xiàn)java對象深度克隆的方法詳解
本篇文章是對序列化存取實現(xiàn)java對象深度克隆的方法進行了詳細的分析介紹,需要的朋友參考下2013-05-05
Java自定義注解實現(xiàn)數(shù)據(jù)脫敏
在實際開發(fā)中經(jīng)常會遇到有一些信息不能全部展示用戶,需要隱藏(可以叫脫敏),所以本文為大家分享了利用自定義注解實現(xiàn)數(shù)據(jù)脫敏的示例代碼,需要的可以參考下2023-07-07
調(diào)用java.lang.Runtime.exec的正確姿勢分享
這篇文章主要介紹了調(diào)用java.lang.Runtime.exec的正確姿勢,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11
解決springboot jpa @Column columnDefinition等屬性失效問題
這篇文章主要介紹了解決springboot jpa @Column columnDefinition等屬性失效問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10
淺談Java中浮點型數(shù)據(jù)保留兩位小數(shù)的四種方法
今天在進行開發(fā)的過程中遇到了一個小問題,是關于如何將double類型的數(shù)據(jù)保留兩位小數(shù)。具有一定的參考價值,本文就詳細的介紹一下2021-09-09
Java中BigDecimal的舍入模式解析(RoundingMode)
這篇文章主要介紹了Java中BigDecimal的舍入模式解析(RoundingMode),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06

