SpringBoot中的server.context-path的實(shí)現(xiàn)
一、問題引入
SpringBoot 在 idea中的 .idea和 .iml文件,我在boot-test的測(cè)試項(xiàng)目中使用的 SpringBoot版本為 1.3.5.RELEASE,新項(xiàng)目 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í)行對(duì)賬開始!!");
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項(xiàng)目中,server.context-path 屬性用于設(shè)置應(yīng)用程序的上下文路徑(context path),這樣應(yīng)用就不會(huì)直接部署在根路徑(/)下,而是部署在指定的路徑下。然而,需要注意的是,從Spring Boot 2.0開始,server.context-path 屬性已經(jīng)被棄用,并被 server.servlet.context-path 所替代。
我這里在 2.4.8 的高版本中,使用了低版本的參數(shù),造成參數(shù)未生效,所以,出現(xiàn)了404連接異常。
3.2.正確展示
對(duì)于Spring Boot 1.x版本,你可以在你的application.properties或application.yml文件中這樣設(shè)置:
application.properties
server.context-path=/cps-task/
對(duì)于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請(qǐng)求響應(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ù)器接收到一個(gè)請(qǐng)求,并且該請(qǐng)求可以通過多種不同的方式或資源來滿足時(shí),服務(wù)器可能會(huì)返回300 Multiple Choices狀態(tài)碼。這意味著服務(wù)器提供了多個(gè)可能的響應(yīng),但由客戶端來決定選擇哪一個(gè)。
當(dāng)客戶端收到300 Multiple Choices狀態(tài)碼時(shí),它應(yīng)該顯示一個(gè)包含所有可能響應(yīng)選項(xiàng)的用戶界面,讓用戶選擇一個(gè)。然而,由于這個(gè)過程可能比較復(fù)雜且用戶體驗(yàn)不佳,因此很少有網(wǎng)站會(huì)這樣做。
/**
* HTTP Status-Code 300: Multiple Choices.
*/
public static final int HTTP_MULT_CHOICE = 300;4.2.3.2.301: Moved Permanently.
Moved Permanently,是一個(gè)HTTP響應(yīng)狀態(tài)碼,表示請(qǐng)求的資源已經(jīng)被永久地移動(dòng)到了由Location頭部所指示的URL上。這是一個(gè)重定向狀態(tài)碼,它告訴客戶端(如瀏覽器)自動(dòng)地訪問新的URL。
特點(diǎn):
- 永久性:301狀態(tài)碼表示的是永久性的重定向,意味著資源已經(jīng)不再存在于請(qǐng)求的URL上,而是永久地遷移到了新的位置。
- 搜索引擎優(yōu)化(SEO):對(duì)于搜索引擎優(yōu)化(SEO)來說,301重定向是一個(gè)重要的工具。當(dāng)網(wǎng)站的結(jié)構(gòu)發(fā)生變化,或者網(wǎng)頁的URL發(fā)生更改時(shí),使用301重定向可以幫助搜索引擎將舊URL的排名和權(quán)重轉(zhuǎn)移到新URL上。
- 緩存:由于這是一個(gè)永久性的重定向,客戶端(如瀏覽器)和中間緩存(如CDN)可能會(huì)緩存這個(gè)重定向信息,以便將來對(duì)相同資源的請(qǐng)求能夠直接訪問新的URL。
使用場景:
- 當(dāng)網(wǎng)站的URL結(jié)構(gòu)發(fā)生變化,但內(nèi)容仍然需要被訪問時(shí)。
- 當(dāng)網(wǎng)站遷移到新的域名或子域名時(shí)。
- 當(dāng)需要將網(wǎng)站的某個(gè)部分或頁面重命名或重新組織時(shí)。
/**
* 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ā)送的請(qǐng)求需要進(jìn)一步重定向到另一個(gè)URL,但這次重定向是臨時(shí)的。與301 Moved Permanently(永久重定向)不同,307 Temporary Redirect表明資源的移動(dòng)是暫時(shí)的,客戶端在將來可能會(huì)再次嘗試訪問原始URL。
特點(diǎn):
- 保持請(qǐng)求方法:與其他重定向狀態(tài)碼(如302 Found)不同,307 Temporary Redirect要求客戶端在重定向時(shí)保持原始請(qǐng)求的方法(如GET、POST等)不變。這意味著,如果原始請(qǐng)求是POST請(qǐng)求,重定向后的請(qǐng)求也應(yīng)該是POST請(qǐng)求,而不是自動(dòng)轉(zhuǎn)換為GET請(qǐng)求。
- 臨時(shí)性:307狀態(tài)碼表明資源的重定向是臨時(shí)的,可能由于網(wǎng)站維護(hù)、服務(wù)器負(fù)載平衡或URL結(jié)構(gòu)臨時(shí)更改等原因?qū)е隆?蛻舳藨?yīng)該繼續(xù)嘗試訪問原始URL,直到服務(wù)器通知其更改已變?yōu)橛谰谩?/li>
使用場景:
- 網(wǎng)站維護(hù):當(dāng)網(wǎng)站正在進(jìn)行臨時(shí)維護(hù)時(shí),服務(wù)器可能會(huì)將用戶的請(qǐng)求重定向到一個(gè)備份服務(wù)器或維護(hù)頁面,以避免服務(wù)中斷。
- URL結(jié)構(gòu)更改:在網(wǎng)站重構(gòu)或升級(jí)過程中,可能需要臨時(shí)更改URL結(jié)構(gòu)。使用307 Temporary Redirect可以確保在更改過程中,用戶仍然能夠訪問網(wǎng)站資源。
- 負(fù)載均衡:在分布式系統(tǒng)中,服務(wù)器可能會(huì)根據(jù)當(dāng)前負(fù)載情況將請(qǐng)求重定向到不同的服務(wù)器。使用307 Temporary Redirect可以確保這種重定向是臨時(shí)的,并且請(qǐng)求方法保持不變。
/**
* HTTP Status-Code 302: Temporary Redirect.
*/
public static final int HTTP_MOVED_TEMP = 302;
4.2.3.4.303: See Other.
See Other,是一個(gè)HTTP重定向狀態(tài)碼,用于指示客戶端使用GET方法向另一個(gè)URI(統(tǒng)一資源標(biāo)識(shí)符)發(fā)送請(qǐng)求,以獲取請(qǐng)求的資源。以下是關(guān)于303 See Other的詳細(xì)解釋:
- 定義:303 See Other狀態(tài)碼表示客戶端應(yīng)使用GET方法定向獲取請(qǐng)求的資源。這通常發(fā)生在客戶端最初使用POST方法發(fā)送請(qǐng)求,但服務(wù)器希望客戶端通過GET方法訪問資源的另一個(gè)URI時(shí)。
- 特點(diǎn):
- 重定向:與301 Moved Permanently和302 Found類似,303 See Other也是一種重定向狀態(tài)碼,但它明確要求客戶端使用GET方法訪問新的URI。
- 方法改變:與307 Temporary Redirect不同,303 See Other允許客戶端在重定向時(shí)改變請(qǐng)求方法,從POST(或其他方法)變?yōu)镚ET。
使用場景:
- 當(dāng)客戶端使用POST方法提交表單,但服務(wù)器希望將用戶重定向到一個(gè)新的頁面以顯示結(jié)果或進(jìn)行進(jìn)一步操作時(shí),可以使用303 See Other狀態(tài)碼。
- 在某些Web應(yīng)用程序中,為了防止表單的重復(fù)提交,服務(wù)器可能會(huì)在處理完P(guān)OST請(qǐng)求后,使用303 See Other將客戶端重定向到一個(gè)新的GET請(qǐng)求頁面。
/**
* HTTP Status-Code 303: See Other.
*/
public static final int HTTP_SEE_OTHER = 303;4.2.3.5.304: Not Modified.
Not Modified,是一個(gè)HTTP響應(yīng)狀態(tài)碼,用于指示客戶端請(qǐng)求的資源自上次請(qǐng)求后沒有發(fā)生改變,因此客戶端可以繼續(xù)使用其緩存的版本,而無需重新下載資源。以下是關(guān)于304 Not Modified的詳細(xì)解釋:
定義與特點(diǎn):
定義:304 Not Modified狀態(tài)碼表示客戶端請(qǐng)求的資源自上次請(qǐng)求以來沒有發(fā)生修改,客戶端可以使用其緩存的版本。
特點(diǎn):
- 節(jié)省帶寬:通過避免不必要的資源下載,可以顯著減少網(wǎng)絡(luò)帶寬的使用。
- 提升性能:減少服務(wù)器負(fù)載,加快頁面加載速度,提升用戶體驗(yàn)。
- 依賴緩存驗(yàn)證:該狀態(tài)碼通常與緩存驗(yàn)證機(jī)制(如ETag或Last-Modified頭部)一起使用,以確保資源的最新性。
使用場景:
- 當(dāng)客戶端(如瀏覽器)已經(jīng)緩存了某個(gè)資源,并且該資源在服務(wù)器上未發(fā)生更改時(shí),服務(wù)器會(huì)返回304 Not Modified狀態(tài)碼。
- 客戶端在發(fā)送請(qǐng)求時(shí),通常會(huì)包含一些條件請(qǐng)求頭部(如If-Modified-Since或If-None-Match),以告訴服務(wù)器它已經(jīng)擁有的資源版本信息。
- 服務(wù)器在收到這些條件請(qǐng)求頭部后,會(huì)檢查請(qǐng)求的資源是否自上次請(qǐng)求以來有所更改。如果沒有更改,服務(wù)器就會(huì)返回304狀態(tài)碼,并且不會(huì)發(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(使用代理)是一個(gè)常見的配置或行為,它涉及到通過代理服務(wù)器來轉(zhuǎn)發(fā)HTTP請(qǐng)求和響應(yīng)。代理服務(wù)器的作用
- 提高訪問速度:代理服務(wù)器可以緩存客戶請(qǐng)求的數(shù)據(jù)。當(dāng)多個(gè)客戶請(qǐng)求相同的數(shù)據(jù)時(shí),代理服務(wù)器可以直接從緩存中提供數(shù)據(jù),而無需再次從原始服務(wù)器獲取,從而提高了訪問速度。
- 防火墻和安全:代理服務(wù)器可以作為防火墻,限制或過濾用戶對(duì)某些網(wǎng)站的訪問。這有助于保護(hù)網(wǎng)絡(luò)免受惡意軟件的攻擊,并提高用戶的安全性。
- 訪問限制資源:在某些情況下,用戶可能無法直接訪問某些網(wǎng)站或服務(wù)。通過代理服務(wù)器,用戶可以繞過這些限制,訪問被限制的資源。
- 隱藏用戶身份:使用代理服務(wù)器時(shí),外部服務(wù)器只能看到代理服務(wù)器的IP地址,而無法看到用戶的真實(shí)IP地址,從而增強(qiáng)了用戶的匿名性。
/**
* HTTP Status-Code 305: Use Proxy.
*/
public static final int HTTP_USE_PROXY = 305;4.2.4.連接錯(cuò)誤——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請(qǐng)求,前段用Post請(qǐng)求
*/
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ù)錯(cuò)誤——5XX: server error
/**
* HTTP Status-Code 500: Internal Server Error.
* @deprecated it is misplaced and shouldn't have existed.
* 內(nèi)部服務(wù)器錯(cuò)誤,它放錯(cuò)地方了,不應(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ù)器錯(cuò)誤。
*/
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)錯(cuò)誤。
*/
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)超時(shí)。
*/
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的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)SpringBoot server.context-path內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- springboot整合websocket后啟動(dòng)報(bào)錯(cuò)(javax.websocket.server.ServerContainer not available)
- SpringBoot服務(wù)設(shè)置禁止server.point端口的使用
- springboot中server.ssl.key-store配置路徑的問題小結(jié)
- 使用Java和SpringBoot實(shí)現(xiàn)服務(wù)器發(fā)送事件(Server-Sent Events)
- SpringBoot實(shí)現(xiàn)Server-Sent Events(SSE)的使用完整指南
- SpringBoot開啟server:compression:enabled(Illegal character ((CTRL-CHAR, code 31)))的問題解決
相關(guān)文章
Maven中pom.xml文件報(bào)錯(cuò)的原因解決
創(chuàng)建Maven項(xiàng)目的時(shí)候,如果你選擇的Packaging為war,那么就會(huì)報(bào)錯(cuò),本文主要介紹了Maven中pom.xml文件報(bào)錯(cuò)的原因解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07
SpringBoot+OCR實(shí)現(xiàn)PDF內(nèi)容識(shí)別的示例代碼
在SpringBoot中,您可以結(jié)合OCR庫來實(shí)現(xiàn)對(duì)PDF文件內(nèi)容的識(shí)別和提取,本文就來介紹一下如何使用 Tesseract 和 pdf2image 對(duì) PDF 文件進(jìn)行OCR識(shí)別和提取,具有一定的參考價(jià)值,感興趣的可以了解一下2023-12-12
SpringBoot實(shí)現(xiàn)網(wǎng)頁消息推送的5種方法對(duì)比
網(wǎng)頁消息推送是現(xiàn)代 Web 應(yīng)用的核心功能之一,Spring Boot 提供了非常成熟的支持,本文為大家整理了 5 種主流實(shí)現(xiàn)方式,有需要的小伙伴可以了解下2026-02-02
Spring配置多個(gè)數(shù)據(jù)源并實(shí)現(xiàn)動(dòng)態(tài)切換示例
本篇文章主要介紹了Spring配置多個(gè)數(shù)據(jù)源并實(shí)現(xiàn)動(dòng)態(tài)切換示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-04-04
專屬于程序員的浪漫-Java輸出動(dòng)態(tài)閃圖iloveyou
這篇文章主要介紹了專屬于程序員的浪漫-Java輸出動(dòng)態(tài)閃圖iloveyou,具有一定參考價(jià)值,需要的朋友可以了解下。2017-11-11
Java利用PDFBox實(shí)現(xiàn)PDF文檔基本操作
這篇文章主要為大家詳細(xì)介紹了java如何利用PDFBox實(shí)現(xiàn)PDF文檔基本操作,例如創(chuàng)建PDF文檔、加載PDF文檔、獲取總頁數(shù)等,需要的小伙伴可以參考下2023-11-11
Java+Spring+MySql環(huán)境中安裝和配置MyBatis的教程
這篇文章主要介紹了Java+Spring+MySql環(huán)境中安裝和配置MyBatis的教程,MyBatis一般被用來增強(qiáng)數(shù)據(jù)庫操作,文中對(duì)MyBatis的主配置文件有較為詳細(xì)的講解,需要的朋友可以參考下2016-04-04

