AJAX在春季获得回报404

时间:2020-03-09 14:11:16

标签: ajax spring-mvc

帮帮我 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/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd“> / WEB-INF /页面/ .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 错误:无法加载资源:服务器以状态为404()响应http://localhost:8080/Blog_war_exploded/login?username=root&password=root

2 个答案:

答案 0 :(得分:0)

看看您的错误:您正在访问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("/")

答案 1 :(得分:0)

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

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

var files=[{id: "slz1", checked: "false"},
       {id: "slz2", checked: "false"}, 
       {id: "slz3", checked: "false"},
       {id: "slz4", checked: "true"}];
var filesJSON=
  JSON.stringify(files).replace(/:[ ]*"(true|false)"/g,':$1' );
  
console.log(JSON.parse(filesJSON));

和方法级别的第二次登录,这意味着您要在/ login下调用/ login服务。

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

因此,在/ login控制器下调用/ login服务的有效URL是:/ login / login

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

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