【问题标题】:AJAX get returns 404 in SpringAJAX 在 Spring 中获取返回 404
【发布时间】: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()

【问题讨论】:

    标签: ajax spring-mvc


    【解决方案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...

    【讨论】:

      猜你喜欢
      • 2015-05-06
      • 1970-01-01
      • 2014-11-24
      • 2018-03-05
      • 2019-10-22
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 2017-10-30
      相关资源
      最近更新 更多