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

相关推荐
Yeniden16 分钟前
【设计模式】# 外观模式(Facade)大白话讲解!
java·设计模式·外观模式
脚踏实地的大梦想家16 分钟前
【Go】P17 Go语言并发编程核心:深入理解 Goroutine (从入门到实战)
java·开发语言·golang
Yeniden16 分钟前
【设计模式】 组合模式(Composite)大白话讲解
java·设计模式·组合模式
初学小白...21 分钟前
线程同步机制及三大不安全案例
java·开发语言·jvm
CS Beginner44 分钟前
【搭建】个人博客网站的搭建
java·前端·学习·servlet·log4j·mybatis
JavaTree20171 小时前
【Spring Boot】Spring Boot解决循环依赖
java·spring boot·后端
lang201509282 小时前
Maven 五分钟入门
java·maven
cj6341181502 小时前
SpringBoot配置Redis
java·后端
用坏多个鼠标2 小时前
Nacos和Nginx集群,项目启动失败问题
java·开发语言
TangKenny2 小时前
基于EasyExcel的动态列映射读取方案
java·easyexcel