一、问题引入
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("执行对账开始!!"); 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
属性已经被弃用,并被 server.servlet.context-path
所替代。
我这里在 2.4.8 的高版本中,使用了低版本的参数,造成参数未生效,所以,出现了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状态码。这意味着服务器提供了多个可能的响应,但由客户端来决定选择哪一个。
当客户端收到300 Multiple Choices状态码时,它应该显示一个包含所有可能响应选项的用户界面,让用户选择一个。然而,由于这个过程可能比较复杂且用户体验不佳,因此很少有网站会这样做。
/** * HTTP Status-Code 300: Multiple Choices. */ public static final int HTTP_MULT_CHOICE = 300;
4.2.3.2.301: Moved Permanently.
Moved Permanently,是一个HTTP响应状态码,表示请求的资源已经被永久地移动到了由Location头部所指示的URL上。这是一个重定向状态码,它告诉客户端(如浏览器)自动地访问新的URL。
特点:
- 永久性:301状态码表示的是永久性的重定向,意味着资源已经不再存在于请求的URL上,而是永久地迁移到了新的位置。
- 搜索引擎优化(SEO):对于搜索引擎优化(SEO)来说,301重定向是一个重要的工具。当网站的结构发生变化,或者网页的URL发生更改时,使用301重定向可以帮助搜索引擎将旧URL的排名和权重转移到新URL上。
- 缓存:由于这是一个永久性的重定向,客户端(如浏览器)和中间缓存(如CDN)可能会缓存这个重定向信息,以便将来对相同资源的请求能够直接访问新的URL。
使用场景:
- 当网站的URL结构发生变化,但内容仍然需要被访问时。
- 当网站迁移到新的域名或子域名时。
- 当需要将网站的某个部分或页面重命名或重新组织时。
/** * HTTP Status-Code 301: Moved Permanently. */ public static final int HTTP_MOVED_PERM = 301;
4.2.3.3.302: Temporary Redirect.
Temporary Redirect,是一种HTTP重定向状态码,用于指示客户端发送的请求需要进一步重定向到另一个URL,但这次重定向是临时的。与301 Moved Permanently(永久重定向)不同,307 Temporary Redirect表明资源的移动是暂时的,客户端在将来可能会再次尝试访问原始URL。
特点:
- 保持请求方法:与其他重定向状态码(如302 Found)不同,307 Temporary Redirect要求客户端在重定向时保持原始请求的方法(如GET、POST等)不变。这意味着,如果原始请求是POST请求,重定向后的请求也应该是POST请求,而不是自动转换为GET请求。
- 临时性:307状态码表明资源的重定向是临时的,可能由于网站维护、服务器负载平衡或URL结构临时更改等原因导致。客户端应该继续尝试访问原始URL,直到服务器通知其更改已变为永久。
使用场景:
- 网站维护:当网站正在进行临时维护时,服务器可能会将用户的请求重定向到一个备份服务器或维护页面,以避免服务中断。
- URL结构更改:在网站重构或升级过程中,可能需要临时更改URL结构。使用307 Temporary Redirect可以确保在更改过程中,用户仍然能够访问网站资源。
- 负载均衡:在分布式系统中,服务器可能会根据当前负载情况将请求重定向到不同的服务器。使用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重定向状态码,用于指示客户端使用GET方法向另一个URI(统一资源标识符)发送请求,以获取请求的资源。以下是关于303 See Other的详细解释:
- 定义:303 See Other状态码表示客户端应使用GET方法定向获取请求的资源。这通常发生在客户端最初使用POST方法发送请求,但服务器希望客户端通过GET方法访问资源的另一个URI时。
-
特点:
- 重定向:与301 Moved Permanently和302 Found类似,303 See Other也是一种重定向状态码,但它明确要求客户端使用GET方法访问新的URI。
- 方法改变:与307 Temporary Redirect不同,303 See Other允许客户端在重定向时改变请求方法,从POST(或其他方法)变为GET。
使用场景:
- 当客户端使用POST方法提交表单,但服务器希望将用户重定向到一个新的页面以显示结果或进行进一步操作时,可以使用303 See Other状态码。
- 在某些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响应状态码,用于指示客户端请求的资源自上次请求后没有发生改变,因此客户端可以继续使用其缓存的版本,而无需重新下载资源。以下是关于304 Not Modified的详细解释:
定义与特点:
定义:304 Not Modified状态码表示客户端请求的资源自上次请求以来没有发生修改,客户端可以使用其缓存的版本。
特点:
- 节省带宽:通过避免不必要的资源下载,可以显著减少网络带宽的使用。
- 提升性能:减少服务器负载,加快页面加载速度,提升用户体验。
- 依赖缓存验证:该状态码通常与缓存验证机制(如ETag或Last-Modified头部)一起使用,以确保资源的最新性。
使用场景:
- 当客户端(如浏览器)已经缓存了某个资源,并且该资源在服务器上未发生更改时,服务器会返回304 Not Modified状态码。
- 客户端在发送请求时,通常会包含一些条件请求头部(如If-Modified-Since或If-None-Match),以告诉服务器它已经拥有的资源版本信息。
- 服务器在收到这些条件请求头部后,会检查请求的资源是否自上次请求以来有所更改。如果没有更改,服务器就会返回304状态码,并且不会发送资源的内容。
/** * HTTP Status-Code 304: Not Modified. */ public static final int HTTP_NOT_MODIFIED = 304;
4.2.3.6.305: Use Proxy.
Use Proxy(使用代理)是一个常见的配置或行为,它涉及到通过代理服务器来转发HTTP请求和响应。代理服务器的作用
- 提高访问速度:代理服务器可以缓存客户请求的数据。当多个客户请求相同的数据时,代理服务器可以直接从缓存中提供数据,而无需再次从原始服务器获取,从而提高了访问速度。
- 防火墙和安全:代理服务器可以作为防火墙,限制或过滤用户对某些网站的访问。这有助于保护网络免受恶意软件的攻击,并提高用户的安全性。
- 访问限制资源:在某些情况下,用户可能无法直接访问某些网站或服务。通过代理服务器,用户可以绕过这些限制,访问被限制的资源。
- 隐藏用户身份:使用代理服务器时,外部服务器只能看到代理服务器的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. * 内部服务器错误,它放错地方了,不应该存在。 * (存在争议,不太确定是HTTP_SERVER_ERROR不应该存在,还是@Deprecated不应该存在) */ @Deprecated public static final int HTTP_SERVER_ERROR = 500; /** * HTTP Status-Code 500: Internal Server Error. * 内部服务器错误。 */ 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. * 网关错误。 */ 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. * 网关超时。 */ 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的实现的文章就介绍到这了,更多相关SpringBoot server.context-path内容请搜索IT俱乐部以前的文章或继续浏览下面的相关文章希望大家以后多多支持IT俱乐部!