背景
因为在不同的启动环境下,获取上下文路径的方式需要有所调整。在 IDEA 中运行时,路径是基于当前页面的 URL(如 index.html
),而在 Tomcat 部署时,它是基于项目上下文路径(如 ssm-project
)。
为了解决这个问题,我们需要动态适配不同的环境,确保无论是本地开发环境还是部署在 Tomcat 中,contextPath
都能够正确获取。
解决方案:
-
使用
window.location.origin
获取根路径:这可以帮助我们从当前的 URL 获取正确的协议(http://
或https
)、主机名(localhost
或其他)以及端口号(如8080
)。然后,我们可以利用它来拼接出正确的contextPath
。 -
使用
window.location.pathname
获取上下文路径:基于pathname
来获取正确的项目路径。
改进后的代码:
<script type="text/javascript">$(function(){// 获取当前页面的上下文路径var pathname = window.location.pathname;var contextPath = '';// 判断项目是否部署在子目录下(例如 /ssm-project/)if (pathname.split('/').length > 2) {contextPath = pathname.split('/')[1]; // 提取项目名}// 如果 contextPath 为空,说明是根路径(开发环境),设置为 ''if (contextPath === "") {contextPath = ""; // 根路径}// 确保 contextPath 后面有一个斜杠if (contextPath && !contextPath.endsWith('/')) {contextPath += '/';}// 确保 window.location.origin 以斜杠结尾var origin = window.location.origin;if (!origin.endsWith('/')) {origin += '/';}// 打印 contextPath 和最终请求 URL(用于调试)console.log('contextPath:', contextPath);var requestUrl = origin + contextPath + 'Agency/GetMessage';console.log('Request URL:', requestUrl); // 确保这里打印出来的 URL 是正确的// 执行 AJAX 请求$.ajax({url: requestUrl, // 使用拼接的 URLsuccess: function (data) {// 处理返回数据console.log(data);},error: function (jqXHR, textStatus, errorThrown) {// 错误处理console.error('请求失败', textStatus, errorThrown);}});});
</script>
代码解释:
-
window.location.pathname.split('/')[1]
:这段代码从pathname
中提取出项目的上下文路径。- 在本地开发环境中,
window.location.pathname
可能是/index.html
,从中我们可以提取出项目名(如果有的话)。 - 在生产环境(Tomcat 部署后)中,
window.location.pathname
可能是/ssm-project/index.html
,我们可以从中提取出ssm-project
。
- 在本地开发环境中,
-
if (contextPath === "")
:如果获取的contextPath
是空字符串(例如,在开发环境中),我们手动将它设置为根路径/
。这样,在开发环境下可以避免路径拼接错误。 -
确保
window.location.origin
以斜杠结尾:如果origin
没有以斜杠结尾,则在拼接前加上斜杠。这可以避免在origin
和contextPath
拼接时出现重复的斜杠或缺失斜杠的情况。 -
确保
contextPath
以斜杠结尾:如果contextPath
不是空字符串且不以斜杠结尾,则添加斜杠。 -
window.location.origin
:它会返回协议、主机名和端口号(如http://localhost:8080
),使得无论是开发环境还是生产环境,contextPath
都能正确拼接到 URL 中。
结果:
- 本地开发环境(IDEA 启动):URL 会拼接成
http://localhost:8080/Login/GetLoginName
。 - Tomcat 部署环境:URL 会拼接成
http://localhost:8080/ssm-project/Login/GetLoginName
。
调试步骤:
打开浏览器的开发者工具(F12),查看控制台输出的 contextPath 和最终拼接的 URL,确保它们符合预期。
检查浏览器中的请求,确保请求的 URL 正确,无论是在 IDEA 还是 Tomcat 中都能正常工作。
总结:
通过检查并确保 contextPath 的正确性和末尾的斜杠,能够确保无论是在本地开发环境还是在生产环境中都能正确发起请求。