Spring MVC中AJAX请求无法显示跳转页面问题排查
哥们,我看了你遇到的问题:用AJAX想从index.jsp跳转到final.jsp,结果点击按钮后页面没变化,后端只看到/redirect被调用,/finalPage没触发,浏览器控制台也没报错。咱们一步步捋清楚问题出在哪。
核心原因:AJAX不是用来做页面跳转的!
首先得明确,AJAX的设计初衷是异步获取/提交数据,它不会自动触发浏览器的页面跳转行为。当你用AJAX调用/redirect接口时,后端返回的重定向指令(302状态码)会被AJAX悄悄在后台处理——它会自动去请求/finalPage,但这个过程完全在浏览器后台完成,不会把拿到的final.jsp内容渲染到当前页面上,所以你看不到任何变化。
至于你说后端日志里没看到/finalPage被调用,大概率是AJAX请求的路径有问题:你在index.jsp里硬编码了/HelloWeb/redirect,如果你的应用部署时的上下文路径不是HelloWeb(比如部署在ROOT目录下),那这个URL就错了,AJAX根本没正确请求到/redirect,自然也不会触发后续的/finalPage。
解决方案:换正确的页面跳转方式
既然你要的是页面跳转,完全没必要用AJAX,直接用浏览器原生的导航方式就行,简单又靠谱:
方案1:修改按钮点击事件,用window.location.href跳转
把index.jsp里的脚本改成这样,记得用动态上下文路径避免硬编码:
<button onClick="redFun()">Redirect Page</button> <script> function redFun() { // 用动态上下文路径,适配不同部署场景 window.location.href = "${pageContext.request.contextPath}/redirect"; } </script>
方案2:更简单,直接用<a>标签代替按钮
如果不需要额外逻辑,直接用链接更省事:
<a href="${pageContext.request.contextPath}/redirect" style="text-decoration:none; padding: 5px 10px; border:1px solid #ccc; border-radius:3px;">Redirect Page</a>
验证后端逻辑是否正常
你可以先在浏览器地址栏直接输入你的应用上下文/redirect(比如http://localhost:8080/HelloWeb/redirect),如果能正常跳转到final.jsp,说明后端的重定向逻辑是没问题的,问题就完全出在前端的AJAX使用方式上。
题外话:如果非要用AJAX(不推荐)
要是你有特殊需求必须用AJAX,那得在成功回调里手动处理页面跳转或者渲染内容,比如:
<script> function redFun() { $.ajax({ type : "GET", url : "${pageContext.request.contextPath}/redirect", success: function(data) { // 要么直接跳转到finalPage window.location.href = "${pageContext.request.contextPath}/finalPage"; // 要么把返回的final.jsp内容替换当前页面 $("body").html(data); } }); } </script>
但说实话,这种方式完全多此一举,AJAX在这里根本没发挥它的异步数据交互作用,反而增加了不必要的复杂度。
内容的提问来源于stack exchange,提问作者Raees Khan

