Thymeleaf通过AJAX实现局部刷新时,请求报错403

主要内容

问题:

在使用springboot(2.6.13)+springsecurity+thymeleaf练习时,通过AJAX调用控制器的POST请求,将返回的HTML片段插入thymeleaf定义的片段标识,来实现局部刷新效果时,发现AJAX请求报错。

PS:这里引用一下我局部刷新的实现方式
SpringBoot+thymeleaf+ajax实现局部刷新详情
Thymeleaf局部刷新
thmeleaf模板引擎使用总结

原因:

还是springsecurity的问题:“Spring Security 默认启用了 CSRF 保护,这意味着对于非 GET、HEAD、TRACE 或 OPTIONS 请求,Spring Security 会期望在请求中包含一个 CSRF 令牌。这个令牌通常是通过一个隐藏的表单字段或一个 HTTP 头部来传输的。”

处理方式

  1. 在配置类中直接关闭springsecurity的CSRF 保护;
  2. 在thymeleaf模板中引入CSRF令牌变量,在AJAX中获取到变量值,调用接口时传递,下面看代码。
<html lang="zh" xmlns:th="http://www.thymeleaf.org">
<head>
//其他内容.....

//头部定义好CSRF参数,这个是thymeleaf与springsecurity约定的参数名称
//不要更改
<meta name="_csrf" th:content="${_csrf.token}" />
<meta name="_csrf_header" th:content="${_csrf.headerName}" />
</head>
<body>

	<div id="pagedlist">
		//具体页面,有一个按钮next来触发ajax...
	</div>

//js内部,调用AJAX时,使用这两个参数
//假设我请求下一页
<script type="text/javascript">
	//事件监听
    $("#pagedlist").on("click", "#next",function () {
    	//获取CSRF
        var csrfToken = 
        	$('meta[name="_csrf"]').attr("content");
        var csrfHeader = 
        	$('meta[name="_csrf_header"]').attr("content");

        $.ajax({
            url: "/user/list",
            type: "post",
            //加上下面的beforeSend的方法还是回调我也不清楚
            beforeSend: function(xhr) {
                xhr.setRequestHeader(csrfHeader, csrfToken);
            },
            
            //下面正常请求
            data: {
                pageNum: 2,
                pageSize: 10
            },
            success: function (data) {
                $("#pagedlist").html(data);
            }
        })
    });
</script>

</body>
</html>
  • 25
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,那么你可以使用jQuery来实现通过Ajax获取数据并动态更新页面的功能。 首先,你需要在HTML文件中引入jQuery库,可以在<head>标签中添加以下代码: ```html <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script> ``` 接着,在页面中添加一个按钮用于触发Ajax请求,比如: ```html <button id="btn-get-data">获取数据</button> ``` 当用户点击该按钮,我们需要通过Ajax请求获取数据并更新页面。可以通过以下代码实现: ```javascript $(document).ready(function() { $("#btn-get-data").click(function() { $.ajax({ url: "your-api-url", // 这里填写你的API地址 method: "GET", // 这里填写请求方法,这里使用GET请求 success: function(data) { // 请求成功后的回调函数,data为服务器返回的数据 $("#data-container").html(data); // 将数据更新到页面上 }, error: function() { // 请求失败后的回调函数 alert("获取数据失败!"); } }); }); }); ``` 在上面的代码中,我们通过jQuery的$.ajax函数来发送Ajax请求,其中: - url:填写你的API地址; - method:填写请求方法,这里使用GET请求; - success:请求成功后的回调函数,其中data为服务器返回的数据; - error:请求失败后的回调函数。 在success函数中,我们将服务器返回的数据更新到页面上,这里假设我们有一个id为data-container的元素用于显示数据。 需要注意的是,由于Ajax请求是异步的,因此数据的更新可能需要一些间才能完成,因此需要在请求成功后再更新页面,否则可能会出现页面未更新的情况。 以上就是使用jQuery实现通过Ajax获取数据并动态更新页面的方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值