在需要验证访问的django中,ajax如何防止用户注销后被访问?

我的前端时jquery,后端是django。我用django自带的auth验证系统授权访问页面。在使用中发现了一个漏洞:
我有2个页面,“ip/a/ “和 “”ip/b/“”,都在views的index函数中定义(判断a或者b的值后流转)。
我打开a页面后,再打开b页面,然后因为没操作用户被自动注销。这时我点击浏览器(谷歌)的后退按键,回到了a页面,
a页面有很多ajax应用,点击页面发送请求的按钮,这些ajax居然都是正常的!!
我的ajax都是以路由的方式映射到后台的view的对应函数,如下:

    path('ajax_rio/', views.ajax_rio,name='ajax_rio'),
    path('ajax_stock_mv/', views.ajax_stock_mv,name='ajax_stock_mv'),
    path('ajax_stock_R_D_bend/', views.ajax_stock_R_D_bend,name='ajax_stock_R_D_bend'),
    path('ajax_stock_risk/', views.ajax_stock_risk,name='ajax_stock_risk'),

请问:我应当在每个ajax函数前加上@login_required装饰器来限制吗?还有没有更好的办法?

其实,并不需要,每个view都加,你可以配置全局的登录验证,这个功能可以通过Middleware中间件来实现。具体怎么写这个中间件,你直接搜索Django全局登陆验证login_required等类似的关键字找,有很多教程。或者我给你找一个:
https://blog.csdn.net/myy1066883508/article/details/106477893

可以在每个需要授权的ajax请求的视图函数中添加@login_required装饰器来限制未登录用户的访问。这将确保只有已登录的用户才能访问这些ajax请求。
另外,您可以通过在ajax请求中发送CSRF令牌来提高安全性。在django中,默认启用了CSRF保护,这将为每个用户生成一个唯一的令牌。您可以在ajax请求中将此令牌作为POST数据或HTTP头发送,并在服务器端进行验证。这可以防止跨站点请求伪造攻击(CSRF)。

在前端代码中,您可以使用以下方法将CSRF令牌添加到ajax请求中:

$(function() {
  // 获取CSRF令牌
  var csrftoken = $("[name=csrfmiddlewaretoken]").val();
  // 将令牌添加到ajax请求中
  $.ajaxSetup({
    beforeSend: function(xhr, settings) {
      xhr.setRequestHeader("X-CSRFToken", csrftoken);
    }
  });
});

此外,您还可以使用django-rest-framework(DRF)为您的ajax请求提供身份验证和授权。 DRF是一个强大的框架,提供了许多工具和功能来简化RESTful API的开发。您可以使用DRF为您的ajax请求提供基于令牌的身份验证和授权,这将确保只有已登录的用户才能访问您的API端点。

在需要验证访问的 Django 中,如果使用了基于会话(Session)的用户认证,用户注销后原有的会话信息就会失效。这时候,即使用户尝试访问需要验证的页面,也会被重定向到登录页面。

在使用 Ajax 的情况下,我们可以在前端代码中通过 XMLHttpRequest 对象的 status 属性来获取后端返回的 HTTP 状态码,如果状态码为 401,就意味着用户未经授权访问了需要验证的资源。这时候,我们可以在前端代码中根据状态码的值,将页面重定向到登录页面或者显示其他相应的错误提示信息。

以下是一个简单的示例代码:

// 向服务器发送 Ajax 请求
var xhr = new XMLHttpRequest();
xhr.open('GET', '/api/some_resource/', true);
xhr.send();

// 监听 Ajax 请求的完成事件
xhr.onreadystatechange = function() {
  if (xhr.readyState === XMLHttpRequest.DONE) {
    if (xhr.status === 200) {
      // 请求成功,处理服务器返回的数据
      console.log(xhr.responseText);
    } else if (xhr.status === 401) {
      // 用户未经授权访问需要验证的资源,重定向到登录页面
      window.location.href = '/login/';
    } else {
      // 其他错误状态码,显示相应的错误提示信息
      console.error(xhr.statusText);
    }
  }
};


在这个示例代码中,我们向服务器发送了一个 GET 请求,如果服务器返回的状态码为 401,就将页面重定向到登录页面。如果状态码为其他的错误码,就将相应的错误信息输出到控制台。