> For the complete documentation index, see [llms.txt](https://doc.kaliphp.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://doc.kaliphp.com/router-ajax.md).

# 异步请求

异步请求包含POST，ajax等多种请求方式，系统会自动进行`异步验证（csrf）`及处理，框架提供了一整套`csrf验证`机制，默认`开启`，可通过在`config/config.php`中将`'csrf_token_on' => false`关闭。

```
'request' => [
    'csrf_token_on'     => false,               // 是否开启令牌验证
    'csrf_token_name'   => 'csrf_token_name',   // 令牌验证的表单隐藏字段名称
    'csrf_token_reset'  => true,                // 令牌验证出错后是否重置令牌 默认为true
    'csrf_cookie_name'  => 'csrf_cookie_name',  // 令牌存放的cookie名称
    'csrf_expire'       => 86400,               // 令牌过期时间，一天
    'csrf_white_ips'    => [                    // csrf IP白名单
        '127.0.0.1/24'
    ],
    'csrf_exclude_uris' => [                    // csrf URL白名单
    ], 
]
```

当csrf验证开启时，前端ajax请求需要预先加载引用`static/frame/js/main.js`文件，ajax提交时，系统会在请求头自动加上验证字段。

```
//ajax.js
jQuery(document).ajaxSend(function(event, xhr, settings) {
    function getCookie(name) {
        var reg = new RegExp("(^| )" + name + "(?:=([^;]*))?(;|$)"),
            val = document.cookie.match(reg);
        return val ? (val[2] ? unescape(val[2]) : "") : null;
    }
    if (typeof xhr.setRequestHeader == "function") {
        if (getCookie('csrf_cookie_name')) {
            xhr.setRequestHeader('X-CSRF-TOKEN', getCookie('csrf_cookie_name'));
        }
    }
});
```

POST请求同样也会触发csrf验证，需要在form中添加如下数据字段：

```
<!-- 加在form中提交 -->
<input type="text" name="_csrf" hidden value="<{form_token type="token"}>"/>
<!-- 或直接传form参数通过smarty生成一个完整的input -->
<{form_token type="form"}>
```

同样也可以在js中获取（前提是引用`static/frame/js/main.js`JS文件），加在POST参数中即可。

```
var _csrf = getCookie('csrf_cookie_name');
```
