通过动态获取项目的上下文路径来确保请求的 URL 兼容两种启动方式(IDEA 启动和 Tomcat 部署)下都能正确解析

背景

因为在不同的启动环境下,获取上下文路径的方式需要有所调整。在 IDEA 中运行时,路径是基于当前页面的 URL(如 index.html),而在 Tomcat 部署时,它是基于项目上下文路径(如 ssm-project)。

为了解决这个问题,我们需要动态适配不同的环境,确保无论是本地开发环境还是部署在 Tomcat 中,contextPath 都能够正确获取。

解决方案:

  1. 使用 window.location.origin 获取根路径 :这可以帮助我们从当前的 URL 获取正确的协议(http://https)、主机名(localhost 或其他)以及端口号(如 8080)。然后,我们可以利用它来拼接出正确的 contextPath

  2. 使用 window.location.pathname 获取上下文路径 :基于 pathname 来获取正确的项目路径。

改进后的代码:

html 复制代码
<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,  // 使用拼接的 URL
            success: 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 没有以斜杠结尾,则在拼接前加上斜杠。这可以避免在 origincontextPath 拼接时出现重复的斜杠或缺失斜杠的情况。

  • 确保 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 的正确性和末尾的斜杠,能够确保无论是在本地开发环境还是在生产环境中都能正确发起请求。

相关推荐
坐吃山猪3 小时前
SpringBoot01-配置文件
java·开发语言
我叫汪枫3 小时前
《Java餐厅的待客之道:BIO, NIO, AIO三种服务模式的进化》
java·开发语言·nio
yaoxtao3 小时前
java.nio.file.InvalidPathException异常
java·linux·ubuntu
Swift社区5 小时前
从 JDK 1.8 切换到 JDK 21 时遇到 NoProviderFoundException 该如何解决?
java·开发语言
DKPT5 小时前
JVM中如何调优新生代和老生代?
java·jvm·笔记·学习·spring
phltxy6 小时前
JVM——Java虚拟机学习
java·jvm·学习
seabirdssss7 小时前
使用Spring Boot DevTools快速重启功能
java·spring boot·后端
喂完待续7 小时前
【序列晋升】29 Spring Cloud Task 微服务架构下的轻量级任务调度框架
java·spring·spring cloud·云原生·架构·big data·序列晋升
benben0447 小时前
ReAct模式解读
java·ai