Spring MVC登录成功后JS跳转WEB-INF下JSP报404的配置方案
看起来你遇到的核心问题是:登录验证成功后,前端通过window.location="home.jsp"跳转时触发404错误。这本质上是路径映射不匹配或者Spring MVC的页面访问规则导致的,咱们一步步来解决:
1. 先搞懂Spring MVC里JSP页面的访问逻辑
在Spring MVC项目中,放在WEB-INF/views/下的JSP页面是不能直接通过URL访问的(比如直接敲xxx/home.jsp),必须通过Controller的请求映射来转发。从你的项目结构截图来看,loginPage.jsp应该是在这个目录下,所以home.jsp大概率也在这里,直接访问jsp文件肯定会404。
2. 给Home页面添加Controller路由
在你的LoginController里新增一个处理/home请求的方法,负责转发到home.jsp,同时还能做登录校验(防止未登录直接访问首页):
@RequestMapping(value="/home", method=RequestMethod.GET) public ModelAndView homePage(HttpServletRequest request) { // 检查session,确保只有登录用户能访问首页 HttpSession session = request.getSession(false); if (session == null || session.getAttribute("name") == null) { // 未登录则重定向回登录页 return new ModelAndView("redirect:/"); } // 已登录则转发到home.jsp return new ModelAndView("home"); }
3. 修改前端跳转代码
把原来直接访问jsp的代码,改成请求上面新增的Controller路由:
if(parsedresult.success == true) { // 注意:如果你的项目部署时有上下文路径,要加上它 var contextPath = "${pageContext.request.contextPath}"; window.location = contextPath + "/home"; }
这里用${pageContext.request.contextPath}是为了适配项目部署的上下文路径(比如Tomcat里项目不是根路径的情况),避免硬编码路径导致的问题。
4. 确认视图解析器配置正确
确保你的Spring MVC配置文件(比如spring-servlet.xml)里的视图解析器已经正确配置了前缀和后缀,这样Controller返回的"home"才能正确映射到/WEB-INF/views/home.jsp:
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/"/> <property name="suffix" value=".jsp"/> </bean>
5. 额外的优化建议
你的Ajax请求用了POST方式,但参数却拼在URL上,这不符合POST请求的规范,建议改成把参数放在请求体里:
function login() { var name = document.getElementById("loginid").value; var password = document.getElementById("password").value; // 用FormData封装参数 var formData = new FormData(); formData.append("name", name); formData.append("password", password); var xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function() { if (this.readyState == 4 && this.status == 200) { var parsedresult = JSON.parse(this.responseText); if(parsedresult.success == true) { var contextPath = "${pageContext.request.contextPath}"; window.location = contextPath + "/home"; } else { document.getElementById("errors").innerHTML = parsedresult.message; } } }; // 加上上下文路径,避免请求路径错误 xhttp.open("POST", "${pageContext.request.contextPath}/loginPage", true); xhttp.send(formData); }
这样参数不会暴露在URL里,安全性和规范性更好。
内容的提问来源于stack exchange,提问作者Lokesh Dev

