javascript - Codeigniter jquery/ajax 外部文件 403

标签 javascript php jquery ajax codeigniter

我正在使用 Codeigniter 3,我有一个脚本,在我的 HTML 中使用时可以正常工作。如果我将代码放入外部文件中,我会收到 403 错误。

我的js文件位于root/jquery/js/myfile.js

错误为“403 Forbidden - localhost/mywebsite/main/explode_link”。

enter image description here

下面是外部 javascript 的开头。

$(document).ready(function(){
        $('.mashed_row a').click(function () {
            var link_id = $(this).attr('link_id');

         $.ajax({
                  type: 'POST',
                   url: 'main/explode_link',
                   data: {'<?php echo $this->security->get_csrf_token_name(); ?>' : '<?php echo $this->security->get_csrf_hash(); ?>', link_id},
                   dataType: 'json',
                   success : function(data) {
                       if(data){

这是我的外部链接。

        <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
    <script src="<?php echo base_url().'jquery/cookie.js'; ?>"></script>
    <script type="text/javascript" src="<?php echo base_url().'jquery/js/rating.js'; ?>"></script>
    <script type="text/javascript" src="<?php echo base_url().'jquery/js/mashed.js'; ?>"></script>
    <?php echo (isset($include_js))? $include_js : ''; ?>   
    <script src="<?php echo base_url().'js/bootstrap.min.js'; ?>"></script>

在 HTML 中运行良好的脚本如下。

        <script type="text/javascript">
        $('.mashed_row a').click(function () {
            var link_id = $(this).attr('link_id');

         $.ajax({
                  type: 'POST',
                   url: '<?php echo base_url(); ?>main/explode_link',
                   data: {'<?php echo $this->security->get_csrf_token_name(); ?>' : '<?php echo $this->security->get_csrf_hash(); ?>', link_id},
                   dataType: 'json',
                   success : function(data) {

最佳答案

403禁止是由于csrf检查失败造成的。发生这种情况是因为在外部文件中对 $this->security 进行了两次调用,其中 $this 没有上下文。换句话说,外部js不知道$this的含义(与 View html不同),并且无法将有用的数据放入用于设置data的对象中。

有几种解决方案。一种是在 view html 页面中创建一个 var 供外部 js 可以使用。

<script>
var csrf = {'<?= $this->security->get_csrf_token_name(); ?>' : '<?= $this->security->get_csrf_hash(); ?>'};
</script>

在外部js中使用上面的var

$(document).ready(function(){
  $('.mashed_row a').click(function () {
    var link_id = $(this).attr('link_id');

    $.ajax(
       {
          type: 'POST',
          url: 'main/explode_link',
          //combine csrf with link_id   
          data: $.extend(csrf, {link_id: link_id}),
          dataType: 'json',
          success : function(data) {
              if(data){

其他选项包括使用 JQuery 从 DOM 中提取 csrf 哈希。但是,您要么必须对 token 名称进行硬编码,要么如上所示传递它。

另一个选项是向 csrf 隐藏输入添加一个 id 属性,该属性可用于 jquery 选择器。但这与在 js 中硬编码 take 名称没有太大区别。

希望这有帮助。

关于javascript - Codeigniter jquery/ajax 外部文件 403,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40077001/

相关文章:

javascript - 获取 Javascript 嵌套数组对象值

javascript - 如何在旧的之上显示更新的谷歌地图信息窗口

javascript - 对于不支持的浏览器, Angular 不向 ng-href 添加哈希

javascript - 在 HTML5 应用程序中使用 IFRAME

php - 从表连接中选择

javascript - 无法使用 JSON 数组绘制折线图

jQuery insertBefore() 和parentNode 显得不稳定

javascript - 我的 Json 在使用 Ajax 发送时被切断

javascript - 从 select jquery 中删除所有选项,但只有一个

jquery - 单击滚动条时自动完成选择元素