跨站请求伪造(csrf)是一种常见的网络攻击,攻击者诱导用户在已登录状态下执行非本意的操作。为了防范此类攻击,laravel框架默认会为每个会话生成一个csrf令牌。这个令牌通常嵌入在html表单中(通过@csrf blade指令)或作为元标签()供ajax请求使用。当服务器接收到请求时,它会验证请求中携带的令牌是否与用户会话中的令牌匹配。如果令牌不匹配或缺失,laravel会抛出“csrf token mismatch”异常。
在某些情况下,尤其是在表单提交失败(例如,服务端验证错误)后,Laravel可能会重新生成会话的CSRF令牌。如果前端AJAX请求仍然使用旧的或首次加载时获取的令牌,那么后续的提交就会因为令牌不匹配而失败。
在开发AJAX驱动的表单时,开发者常会为了方便,将CSRF令牌的头部信息通过$.ajaxSetup进行全局配置,如下所示:
$.ajaxSetup({ headers: { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') } });
这种做法在大多数情况下是有效的,因为页面加载时,$('meta[name="csrf-token"]').attr('content')会获取到当前的CSRF令牌。然而,当用户提交表单,并且服务器因某种错误(如验证失败)而响应时,Laravel可能会在响应过程中刷新会话的CSRF令牌。此时,meta标签中的令牌值并不会自动更新。如果$.ajaxSetup只在页面加载时执行一次,那么后续的AJAX请求将继续使用旧的、已失效的令牌,从而导致“CSRF token mismatch”错误。
解决此问题的关键在于,确保每次AJAX请求发送时,都能够获取并使用当前最新的CSRF令牌。这意味着我们不应该依赖$.ajaxSetup的单次执行来设置全局令牌,而应该在每次具体的$.ajax请求中,动态地从meta标签中读取令牌值。
通过将headers配置直接放置在$.ajax请求内部,可以保证每次请求发送前,都会重新查询meta[name="csrf-token"]标签的内容,从而获取到最新的CSRF令牌。
以下是修正后的JavaScript代码示例:
$(document).ready(function() { $('#send_form').click(function(e) { e.preventDefault(); $('#send_form').html('Sending..'); // 更新按钮状态 /* 提交表单数据使用 AJAX */ $.ajax({ url: "{{ route('register')}}", method: 'POST', // 将 CSRF 令牌头部信息直接放置在每次请求中 headers: { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') }, data: $('#ajax-register-form').serialize(), success: function(response) { $('#send_form').html('Submit'); // 恢复按钮状态 document.getElementById("ajax-register-form").reset(); // 重置表单 // 处理成功响应,例如显示成功消息 }, error: function(data) { var errors = data.responseJSON; console.log(errors); // 打印错误信息 $('.error-warning').show(); // 显示错误警告 // 处理错误响应,例如显示验证错误信息 } }); }); });
解释:
当用户首次提交表单(即使失败),或者服务器在处理请求后重新生成了CSRF令牌时,新的令牌值会立即反映在HTML文档的标签中。通过在每次$.ajax请求中都执行$('meta[name="csrf-token"]').attr('content'),我们确保了每次发送请求时,都会读取到该标签的最新内容,从而避免了使用过期令牌的问题。
在Laravel应用中处理AJAX表单提交时的CSRF令牌问题,关键在于理解令牌的生命周期和更新机制。通过将CSRF令牌的头部设置从全局$.ajaxSetup移动到每次具体的$.ajax请求中,我们能够确保每次请求都动态地获取并使用最新的CSRF令牌,从而有效避免“CSRF token mismatch”错误,提升应用的健壮性和用户体验。这种策略不仅解决了令牌失效的问题,也为未来的令牌管理提供了更灵活的基础。
以上就是解决Laravel AJAX请求中CSRF令牌失效:确保每次请求都使用最新令牌的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号