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()) { // 不輸入符合預(yù)期的格式,進(jìn)行下一步操作 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
屬性用于設(shè)置應(yīng)用程序的上下文路徑(context path),這樣應(yīng)用就不會直接部署在根路徑(/)下,而是部署在指定的路徑下。然而,需要注意的是,從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
文件中這樣設(shè)置:
application.properties
server.context-path=/cps-task/
對于Spring Boot 2.x及更高版本,application.properties 文件應(yīng)該這樣設(shè)置:
server.servlet.context-path=/cps-task/
而application.yml 的
YAML格式的配置文件,應(yīng)該這樣設(shè)置:
# application.yml server: servlet: context-path: /cps-task/
四、HTTP請求響應(yīng)碼簡介
4.1.響應(yīng)碼參考來源
java.net.HttpURLConnection;
4.2.源碼示例
4.2.1.源碼總述
HTTP的響應(yīng)代碼,從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指當(dāng)服務(wù)器接收到一個請求,并且該請求可以通過多種不同的方式或資源來滿足時,服務(wù)器可能會返回300 Multiple Choices狀態(tài)碼。這意味著服務(wù)器提供了多個可能的響應(yīng),但由客戶端來決定選擇哪一個。
當(dāng)客戶端收到300 Multiple Choices狀態(tài)碼時,它應(yīng)該顯示一個包含所有可能響應(yīng)選項的用戶界面,讓用戶選擇一個。然而,由于這個過程可能比較復(fù)雜且用戶體驗不佳,因此很少有網(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響應(yīng)狀態(tài)碼,表示請求的資源已經(jīng)被永久地移動到了由Location頭部所指示的URL上。這是一個重定向狀態(tài)碼,它告訴客戶端(如瀏覽器)自動地訪問新的URL。
特點:
- 永久性:301狀態(tài)碼表示的是永久性的重定向,意味著資源已經(jīng)不再存在于請求的URL上,而是永久地遷移到了新的位置。
- 搜索引擎優(yōu)化(SEO):對于搜索引擎優(yōu)化(SEO)來說,301重定向是一個重要的工具。當(dāng)網(wǎng)站的結(jié)構(gòu)發(fā)生變化,或者網(wǎng)頁的URL發(fā)生更改時,使用301重定向可以幫助搜索引擎將舊URL的排名和權(quán)重轉(zhuǎn)移到新URL上。
- 緩存:由于這是一個永久性的重定向,客戶端(如瀏覽器)和中間緩存(如CDN)可能會緩存這個重定向信息,以便將來對相同資源的請求能夠直接訪問新的URL。
使用場景:
- 當(dāng)網(wǎng)站的URL結(jié)構(gòu)發(fā)生變化,但內(nèi)容仍然需要被訪問時。
- 當(dāng)網(wǎng)站遷移到新的域名或子域名時。
- 當(dā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ā)送的請求需要進(jìn)一步重定向到另一個URL,但這次重定向是臨時的。與301 Moved Permanently(永久重定向)不同,307 Temporary Redirect表明資源的移動是暫時的,客戶端在將來可能會再次嘗試訪問原始URL。
特點:
- 保持請求方法:與其他重定向狀態(tài)碼(如302 Found)不同,307 Temporary Redirect要求客戶端在重定向時保持原始請求的方法(如GET、POST等)不變。這意味著,如果原始請求是POST請求,重定向后的請求也應(yīng)該是POST請求,而不是自動轉(zhuǎn)換為GET請求。
- 臨時性:307狀態(tài)碼表明資源的重定向是臨時的,可能由于網(wǎng)站維護(hù)、服務(wù)器負(fù)載平衡或URL結(jié)構(gòu)臨時更改等原因?qū)е?。客戶端?yīng)該繼續(xù)嘗試訪問原始URL,直到服務(wù)器通知其更改已變?yōu)橛谰谩?/li>
使用場景:
- 網(wǎng)站維護(hù):當(dāng)網(wǎng)站正在進(jìn)行臨時維護(hù)時,服務(wù)器可能會將用戶的請求重定向到一個備份服務(wù)器或維護(hù)頁面,以避免服務(wù)中斷。
- URL結(jié)構(gòu)更改:在網(wǎng)站重構(gòu)或升級過程中,可能需要臨時更改URL結(jié)構(gòu)。使用307 Temporary Redirect可以確保在更改過程中,用戶仍然能夠訪問網(wǎng)站資源。
- 負(fù)載均衡:在分布式系統(tǒng)中,服務(wù)器可能會根據(jù)當(dāng)前負(fù)載情況將請求重定向到不同的服務(wù)器。使用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)一資源標(biāo)識符)發(fā)送請求,以獲取請求的資源。以下是關(guān)于303 See Other的詳細(xì)解釋:
- 定義:303 See Other狀態(tài)碼表示客戶端應(yīng)使用GET方法定向獲取請求的資源。這通常發(fā)生在客戶端最初使用POST方法發(fā)送請求,但服務(wù)器希望客戶端通過GET方法訪問資源的另一個URI時。
- 特點:
- 重定向:與301 Moved Permanently和302 Found類似,303 See Other也是一種重定向狀態(tài)碼,但它明確要求客戶端使用GET方法訪問新的URI。
- 方法改變:與307 Temporary Redirect不同,303 See Other允許客戶端在重定向時改變請求方法,從POST(或其他方法)變?yōu)镚ET。
使用場景:
- 當(dāng)客戶端使用POST方法提交表單,但服務(wù)器希望將用戶重定向到一個新的頁面以顯示結(jié)果或進(jìn)行進(jìn)一步操作時,可以使用303 See Other狀態(tài)碼。
- 在某些Web應(yīng)用程序中,為了防止表單的重復(fù)提交,服務(wù)器可能會在處理完P(guān)OST請求后,使用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響應(yīng)狀態(tài)碼,用于指示客戶端請求的資源自上次請求后沒有發(fā)生改變,因此客戶端可以繼續(xù)使用其緩存的版本,而無需重新下載資源。以下是關(guān)于304 Not Modified的詳細(xì)解釋:
定義與特點:
定義:304 Not Modified狀態(tài)碼表示客戶端請求的資源自上次請求以來沒有發(fā)生修改,客戶端可以使用其緩存的版本。
特點:
- 節(jié)省帶寬:通過避免不必要的資源下載,可以顯著減少網(wǎng)絡(luò)帶寬的使用。
- 提升性能:減少服務(wù)器負(fù)載,加快頁面加載速度,提升用戶體驗。
- 依賴緩存驗證:該狀態(tài)碼通常與緩存驗證機(jī)制(如ETag或Last-Modified頭部)一起使用,以確保資源的最新性。
使用場景:
- 當(dāng)客戶端(如瀏覽器)已經(jīng)緩存了某個資源,并且該資源在服務(wù)器上未發(fā)生更改時,服務(wù)器會返回304 Not Modified狀態(tài)碼。
- 客戶端在發(fā)送請求時,通常會包含一些條件請求頭部(如If-Modified-Since或If-None-Match),以告訴服務(wù)器它已經(jīng)擁有的資源版本信息。
- 服務(wù)器在收到這些條件請求頭部后,會檢查請求的資源是否自上次請求以來有所更改。如果沒有更改,服務(wù)器就會返回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(使用代理)是一個常見的配置或行為,它涉及到通過代理服務(wù)器來轉(zhuǎn)發(fā)HTTP請求和響應(yīng)。代理服務(wù)器的作用
- 提高訪問速度:代理服務(wù)器可以緩存客戶請求的數(shù)據(jù)。當(dāng)多個客戶請求相同的數(shù)據(jù)時,代理服務(wù)器可以直接從緩存中提供數(shù)據(jù),而無需再次從原始服務(wù)器獲取,從而提高了訪問速度。
- 防火墻和安全:代理服務(wù)器可以作為防火墻,限制或過濾用戶對某些網(wǎng)站的訪問。這有助于保護(hù)網(wǎng)絡(luò)免受惡意軟件的攻擊,并提高用戶的安全性。
- 訪問限制資源:在某些情況下,用戶可能無法直接訪問某些網(wǎng)站或服務(wù)。通過代理服務(wù)器,用戶可以繞過這些限制,訪問被限制的資源。
- 隱藏用戶身份:使用代理服務(wù)器時,外部服務(wù)器只能看到代理服務(wù)器的IP地址,而無法看到用戶的真實IP地址,從而增強(qiáng)了用戶的匿名性。
/** * 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.服務(wù)錯誤——5XX: server error
/** * HTTP Status-Code 500: Internal Server Error. * @deprecated it is misplaced and shouldn't have existed. * 內(nèi)部服務(wù)器錯誤,它放錯地方了,不應(yīng)該存在。 * (存在爭議,不太確定是HTTP_SERVER_ERROR不應(yīng)該存在,還是@Deprecated不應(yīng)該存在) */ @Deprecated public static final int HTTP_SERVER_ERROR = 500; /** * HTTP Status-Code 500: Internal Server Error. * 內(nèi)部服務(wù)器錯誤。 */ 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)關(guān)錯誤。 */ public static final int HTTP_BAD_GATEWAY = 502; /** * HTTP Status-Code 503: Service Unavailable. * 服務(wù)不可用 */ public static final int HTTP_UNAVAILABLE = 503; /** * HTTP Status-Code 504: Gateway Timeout. * 網(wǎng)關(guān)超時。 */ public static final int HTTP_GATEWAY_TIMEOUT = 504; /** * HTTP Status-Code 505: HTTP Version Not Supported. * 不支持HTTP版本。 */ public static final int HTTP_VERSION = 505;
到此這篇關(guān)于SpringBoot中的server.context-path的實現(xiàn)的文章就介紹到這了,更多相關(guān)SpringBoot server.context-path內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- springboot整合websocket后啟動報錯(javax.websocket.server.ServerContainer not available)
- SpringBoot服務(wù)設(shè)置禁止server.point端口的使用
- springboot中server.ssl.key-store配置路徑的問題小結(jié)
- 使用Java和SpringBoot實現(xiàn)服務(wù)器發(fā)送事件(Server-Sent Events)
- SpringBoot實現(xiàn)Server-Sent Events(SSE)的使用完整指南
- SpringBoot開啟server:compression:enabled(Illegal character ((CTRL-CHAR, code 31)))的問題解決
相關(guān)文章
基于序列化存取實現(xiàn)java對象深度克隆的方法詳解
本篇文章是對序列化存取實現(xiàn)java對象深度克隆的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05Java自定義注解實現(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ù)的四種方法
今天在進(jìn)行開發(fā)的過程中遇到了一個小問題,是關(guān)于如何將double類型的數(shù)據(jù)保留兩位小數(shù)。具有一定的參考價值,本文就詳細(xì)的介紹一下2021-09-09Java中BigDecimal的舍入模式解析(RoundingMode)
這篇文章主要介紹了Java中BigDecimal的舍入模式解析(RoundingMode),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06