Spring Security CSRF解决POST请求验证问题

. p o s t .post 或者其他的 .ajax请求不能访问后台,代码都是对的,但是请求都到不了后台,经过了多方排查,花了几个小时我终于知道了原因。记录一下。

在看浏览器的html代码时发现了有一个隐藏表单

原来是我使用了Spring Security

Spring Security 4.0之后,引入了CSRF,默认是开启。不得不说,CSRF和RESTful技术有冲突。CSRF默认支持的方法: GET|HEAD|TRACE|OPTIONS,不支持POST。

也就是说POST的请求需要验证。

解决:

前端页面

<!--在HTML页面加上,也可以搞个隐藏域来-->
<!-- CSRF -->
<meta name="_csrf" th:content="${_csrf.token}"/>
<!-- default header name is X-CSRF-TOKEN -->
<meta name="_csrf_header" th:content="${_csrf.headerName}"/>

js

$("#username").change(function () {
        // 获取 CSRF Token
        var csrfToken = $("meta[name='_csrf']").attr("content");
        var csrfHeader = $("meta[name='_csrf_header']").attr("content");
        var username1 = $(this).val();
        username1 = $.trim(username1);

        $.ajax({
            url: "http://localhost:8080/cwblog/user/ajaxValidateUsername",
            type: "post",
            data: {
                "username": username1,
                "date": new Date()
            },
            beforeSend: function(request) {
                request.setRequestHeader(csrfHeader, csrfToken); // 添加  CSRF Token
            },
            success: function(data){
                alert("post中");
                alert(typeof data);
                alert(data);
                if (data.toString() == "0") {
                    alert("用户名已被占用");
                } else {
                    alert("error");
                }
            },
            error : function() {
                alert("error!");
            }
        });
    });

猜你喜欢

转载自blog.csdn.net/qq_37859539/article/details/82819664