Spring中AJAX GET请求返回404问题求助(含相关代码)
咱们一步步拆解这个404问题,核心原因基本是接口路径没被Spring正确映射,或者Spring压根没找到你的LoginController,下面是具体排查和修复步骤:
1. 最可能的原因:Spring没扫描到你的LoginController
看你提供的spring-config-servlet.xml,里面没有配置组件扫描和MVC注解驱动,这会导致Spring无法发现带有@Controller注解的类,自然也就不会注册对应的接口路径。
修复方法:
在spring-config-servlet.xml中添加以下配置(记得把包路径换成你实际的Controller所在包,比如你的LoginController在com.blog.controller下):
<!-- 启用Spring MVC注解驱动,支持@RequestMapping等注解 --> <mvc:annotation-driven/> <!-- 扫描Controller所在的包,让Spring识别你的控制器类 --> <context:component-scan base-package="com.blog.controller"/>
2. Controller的路径映射重复,导致实际接口路径不匹配
你的LoginController类上标注了@RequestMapping("/login"),同时方法上又加了@RequestMapping(value = { "/login" }, method = RequestMethod.GET),这会导致实际的接口路径变成**/login/login**,但前端请求的是/login,自然会返回404。
修复方法(二选一):
方案一:去掉类上的@RequestMapping
直接删除类上的@RequestMapping("/login"),这样方法上的/login就是最终的接口路径,和前端请求一致:// 去掉类上的@RequestMapping("/login") @Controller public class LoginController { @Autowired private UserService userService; @RequestMapping(value = "/login", method = RequestMethod.GET) @ResponseBody public int checkValid(/* 参数列表不变 */){ // 原有逻辑不变 } }方案二:调整类上的路径前缀
把类上的@RequestMapping改成其他前缀,比如/auth,这样接口路径变成/auth/login,同时前端ajax的url也要对应改成auth/login:@RequestMapping("/auth") @Controller public class LoginController { // ... 其他代码不变 @RequestMapping(value = "/login", method = RequestMethod.GET) @ResponseBody public int checkValid(/* 参数列表不变 */){ // 原有逻辑不变 } }前端代码修改:
$.ajax({ url:"auth/login", // 这里改成对应路径 // 其他配置不变 });
3. 检查DispatcherServlet的映射配置(web.xml)
确保你的web.xml中,Spring的DispatcherServlet映射路径是/,这样所有请求都会经过Spring MVC处理。如果映射的是*.do这类后缀,那你的接口路径需要带上.do,前端请求也得对应修改。
标准的DispatcherServlet配置示例:
<servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-config-servlet.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <!-- 映射所有请求,除了静态资源 --> <url-pattern>/</url-pattern> </servlet-mapping>
4. 小细节:前端AJAX的contentType设置(不影响404,但可以优化)
你前端AJAX设置了contentType: 'application/json;charset=utf-8',但GET请求的参数是通过URL传递的(你用的是data: { username:..., password:... },jQuery会自动转成URL参数),这个contentType设置对GET请求无效,可以删掉或者改成application/x-www-form-urlencoded,不过这不是导致404的原因。
最后验证步骤
- 把上述修改完成后,重启Tomcat服务器
- 打开浏览器的开发者工具(F12),重新发起登录请求,查看请求的URL是否和你配置的接口路径一致
- 如果还是有问题,可以查看Tomcat的日志,看看Spring启动时有没有扫描到LoginController类
内容的提问来源于stack exchange,提问作者trandiep010

