通过动态获取项目的上下文路径来确保请求的 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 的正确性和末尾的斜杠,能够确保无论是在本地开发环境还是在生产环境中都能正确发起请求。

相关推荐
XuanXu37 分钟前
Java volatile关键字以及线程安全
java
都叫我大帅哥37 分钟前
代码世界的「万能转接头」:适配器模式的跨界艺术
java·后端·设计模式
蝈蝈噶蝈蝈噶1 小时前
问题:tomcat下部署eureka双重路径
java·eureka·tomcat
禹曦a1 小时前
Java进阶之旅-day05:网络编程
java·开发语言·网络
五行星辰1 小时前
Gson修仙指南:谷歌大法的佛系JSON渡劫手册
java·后端
哈哈哈哈哈哈哈哈哈...........1 小时前
【无标题】object,wait,notifyAll
java·开发语言
气π1 小时前
【JavaWeb-Spring boot】学习笔记
spring boot·http·tomcat
Niuguangshuo1 小时前
Python 设计模式:迭代模式
java·python·设计模式
1ven1 小时前
JDBC驱动包的隔离加载与卸载
java