Invalid CSRF Token 'null' was found on the request parameter '_csrf' or header 'X-CSRF-TOKEN'

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

       解决方法有两种:

       第一种是在spring security的配置类中将csrf功能禁用,如下

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.csrf().disable().authorizeRequests() //这里将csrf置为disable,禁用
            .antMatchers("/").permitAll().anyRequest().authenticated()...//其他配置

  

       第二种是把csrf参数加上,这里有两种情况:

      (1)如果是一个表单提交,例如登陆表单或其他表单,我们可以在表单里面加入一个隐藏域,用来存放csrf参数:

<form class="col s12" action="/login" method="post">
    
    <input id="username" name="username" type="text" class="validate"/>
            
    
    <input id="password" name="password" type="password" class="validate"/>
            
    
    <button class="btn indigo waves-effect waves-light" type="submit" name="action">Submit
        <i class="mdi-content-send right">i>
    button>
  
    <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
form>

     

    (2)如果是发送ajax请求,我们可以将csrf参数放在页面head标签里的meta元素中,然后就可以在页面加载的时候设置ajax全局属性,即将全局ajax操作附加header属性,在header将csrf参数带进去:

<#assign security=JspTaglibs["http://www.springframework.org/security/tags"]/>
html>
<html>
<head>
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
    <meta charset="utf-8"/>
    <title>管理title>
    <meta name="_csrf" content="${_csrf.token}" />
    <meta name="_csrf_header" content="${_csrf.headerName}" />
    <meta name="description" content="Restyling jQuery UI Widgets and Elements"/>
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0"/>
    <link rel="stylesheet" href="/css/basic.css"/>
   
head>
<body class="no-skin">
   // 中间省略
    
<#include "../footer/footer.ftl">
    
<#include "../scripts/scripts.ftl">
<script type="text/javascript" src="/dist/js/user/group/groupList.js">script>
<script src="/dist/js/toastr.js">script>
<script>
   
    var token = $("meta[name='_csrf']").attr("content");
    var header = $("meta[name='_csrf_header']").attr("content");
    $(document).ajaxSend(function(e, xhr, options) {
        xhr.setRequestHeader(header, token);
    });

script>
body>
html>

   

    这样的话,每次发送ajax请求都会携带那个参数,打开浏览器控制台,查看一条ajax请求,会在Header一栏看到如下信息:

Invalid CSRF Token 'null' was found on the request parameter '_csrf' or header 'X-CSRF-TOKEN'_第1张图片


    参考博客:https://stackoverflow.com/questions/23477344/put-csrf-into-headers-in-spring-4-0-3-spring-security-3-2-3-thymeleaf-2-1-2

你可能感兴趣的:(springsecurity)