AJAX 在 Spring 中获取返回 404

Posted

技术标签:

【中文标题】AJAX 在 Spring 中获取返回 404【英文标题】:AJAX get returns 404 in Spring 【发布时间】:2020-03-09 14:11:16 【问题描述】:

帮帮我 index.jsp

$("#btn-submit").click(function () 
    var username=document.getElementById("username");
    var password=document.getElementById("password");
    $.ajax(
        url:"login",
        contentType: 'application/json;charset=utf-8',
        dataType: 'text',
        headers: 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content'),
        data: 
            username:username.value,
            password:password.value
        ,
        type: 'get',
        success: function (response) 
            if (response=="1") 
                alert(response);
            
            else alert(response);
        ,
        error: function (x, e) 
            console.log(e)
        
    );
);

LoginController.java

@RequestMapping("/login")
@Controller
public class LoginController 

    @Autowired
    private UserService userService;

    @RequestMapping(value =  "/login" , method = RequestMethod.GET)
    @ResponseBody
    public int checkValid(@RequestParam("username") String username,@RequestParam("password") String password, HttpServletRequest request, HttpServletResponse response, Locale locale, Model model)
        try 
            if (userService.findByUserName(username).equals(hashPass(password)))
                return 1;
            
         catch (NoSuchAlgorithmException e) 
            e.printStackTrace();
            return 0;
        
        return 0;
    
    public String hashPass(String pass) throws NoSuchAlgorithmException 
        MessageDigest md = MessageDigest.getInstance("SHA-256");
        byte[] hashInBytes = md.digest(pass.getBytes(StandardCharsets.UTF_8));

        // bytes to hex
        StringBuilder sb = new StringBuilder();
        for (byte b : hashInBytes) 
            sb.append(String.format("%02x", b));
        
        return sb.toString();
    

spring-config-servlet.xml

<?xml version="1.0" encoding="UTF-8"?>

http://www.springframework.org/schema/jdbc/spring-jdbc-4.3.xsd http://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-4.3.xsd http://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-4.3.xsd"> /WEB-INF/pages/ .jsp /resources/jdbc.properties

<!-- Enable Annotation based Declarative Transaction Management -->
<tx:annotation-driven proxy-target-class="true"
                      transaction-manager="transactionManager" />

<!-- Creating TransactionManager Bean, since JDBC we are creating of type
  DataSourceTransactionManager -->
<bean id="transactionManager"
      class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
</bean>
<bean id="postsDAO" class="com.blog.dao.impl.PostsDAO">
    <property name="jdbcTemplate" ref="jdbcTemplate"/>
</bean>
<bean id="postsService" class="com.blog.service.impl.PostsService">
    <property name="postsDAO" ref="postsDAO"/>
</bean>
<bean id="userDAO" class="com.blog.dao.impl.UserDAO">
    <property name="jdbcTemplate" ref="jdbcTemplate"/>
</bean>
<bean id="userService" class="com.blog.service.impl.UserService">
    <property name="userDAO" ref="userDAO"/>
</bean>

我使用tomcat 9 错误:加载资源失败:服务器响应http://localhost:8080/Blog_war_exploded/login?username=root&password=root,状态为404()

【问题讨论】:

【参考方案1】:

看看你的错误:你正在访问http://localhost:8080/Blog_war_exploded/login,但你实际上想访问http://localhost:8080/login

原因是您将 URL 指定为 login 而不是 /login,因此它是相对于当前“目录”而不是根目录。

更改代码以使用/login 应该可以解决它:

    $.ajax(
        url: "/login",
        ...
    )

附带说明,通过 GET 请求执行此操作不是一个好主意 - 除其他外,密码将以明文形式存储在服务器日志中。您应该改用 POST 请求。


更新:

此外,您似乎对/login 使用两个 请求映射,因此您最终会得到/login/login。查看how to use @RequestMapping properly。

尝试将第二个(方法级别)更改为 @RequestMapping(value = "/" , method = RequestMethod.GET) 或只是 @RequestMapping("/")

【讨论】:

/login,而不是/ login。 “没用”是什么意思?请分享到底发生了什么,我确定错误消息是不同的。 编辑后出现错误:GET localhost:8080/login?username=1&password=1 404 sorry for bad english 您是否在我更新的答案中也尝试了第二个修复?关于请求映射。【参考方案2】:

我认为这个问题与您在控制器级别和方法级别上的 RequestMapping 定义有关。

控制器级别的第一次登录,意味着如果你想访问这个控制器中的任何服务,你的请求必须以“/login”开头

@RequestMapping("/login")
@Controller
public class LoginController 

第二次登录在方法级别,表示要调用/login下的/login服务。

 @RequestMapping(value =  "/login" , method = RequestMethod.GET)
 @ResponseBody
 public int checkValid(@RequestParam("username") String username,@RequestParam("password") String password, HttpServletRequest request, HttpServletResponse response, Locale locale, Model model)

所以在 /login 控制器下调用 /login 服务的有效 URL 是:/login/login

因此,您的网址 /login 未找到

您可以在控制器级别删除第一个 /login,或者使用 ajax 请求中的 /login/login...

【讨论】:

以上是关于AJAX 在 Spring 中获取返回 404的主要内容,如果未能解决你的问题,请参考以下文章

ajax 后台java代码执行完毕 前端报404错误

获取 JWT 后,带有 Spring Boot 后端的 Angular 在现有路由上返回 404

获取 https://localhost/myapp/saml/sso 重定向会引发 404 错误 - Spring MVC/Okta

Ajax 在 Laravel 8 中返回 404 错误但路由存在

Ajax请求返回结果为404问题

将 URL 作为发布数据传递时,jQuery ajax 返回 404 错误