2015-10-15 100 views
4

默认情况下,bloodhound.js将通过HTTP GET进行查询,但这会让您容易受到JSON hijacking的影响。由于我有敏感的信息,我想加载到预先输入,HTTP GET使我容易受到攻击。过去有一个选择帖子的选项(如下所示:typeahead.js remote beforesend post data issue),但这不适用于最新版本(v.0.11.1)。使用HTTP POST和typeahead js和bloodhound js

+0

https://stackoverflow.com/a/46927923/3966458没有Ajax –

回答

8

我花了很多心痛和试验才得到这个。在最新版本(v.0.11.1)中有一个transport函数选项,你可以使用它来委托给你想要的任何东西(websockets,或简单的旧版本$.ajax)。

var accountBloodhound = new Bloodhound({ 
    datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'), 
    queryTokenizer: Bloodhound.tokenizers.whitespace, 

    remote: { 
     url: '/account/search#%QUERY', 
     wildcard: '%QUERY', 
     transport: function (opts, onSuccess, onError) { 
      var url = opts.url.split("#")[0]; 
      var query = opts.url.split("#")[1]; 
      $.ajax({ 
       url: url, 
       data: "search=" + query, 
       type: "POST", 
       success: onSuccess, 
       error: onError, 
      }) 
     } 
    } 
}); 

$('#remote .typeahead').typeahead(null, { 
    name: 'best-pictures', 
    display: 'value', 
    source: accountBloodhound 
}).bind('typeahead:select', function (ev, suggestion) { 
    console.log('Selection: ' + suggestion); 
}); 
+1

你的心痛已经偿清;) –

2

Link将有助于

var searchAuto = new Bloodhound({ 
    datumTokenizer: Bloodhound.tokenizers.obj.whitespace('word'), 
    queryTokenizer: Bloodhound.tokenizers.whitespace, 
    remote: { 
     url: base_url + 'ajax/get_words', 
     prepare: function (q, rq) { 

      $(".typeahead-loader").show(); 

      rq.data = { 
       q: $("#SearchData").val(), 
       // source: 'S01', 
       searchtype: $("#Searchtype").val(), 
       language: $("#language").val(), 
       author: $("#author").val(), 
       raag: $("#raag").val(), 
       page_from: $("#page_from").val(), 
       page_to: $("#page_to").val() 
      }; 
      return rq; 
     }, 
     transport: function (obj, onS, onE) { 

      $.ajax(obj).done(done).fail(fail).always(always); 

      function done(data, textStatus, request) { 
       // Don't forget to fire the callback for Bloodhound 
       onS(data); 
      } 

      function fail(request, textStatus, errorThrown) { 
       // Don't forget the error callback for Bloodhound 
       onE(errorThrown); 
      } 

      function always() { 
       $(".typeahead-loader").hide(); 
      } 
     } 
    } 
}); 

如果CONSOLE.LOG obj的,即,第一个参数,你会得到

enter image description here

,你可以很容易地覆盖typeobj

obj.type = 'POST'

希望这有助于...