2015-10-15 7 views
4

По умолчанию bloodhound.js будет запрашивать через HTTP GET, но это оставляет вас уязвимым для JSON hijacking. Поскольку у меня есть конфиденциальная информация, которую я хочу загрузить в typeahead, HTTP GET оставляет меня уязвимым. Раньше была опция для выбора сообщения (как показано здесь: typeahead.js remote beforesend post data issue), но это не работает с последней версией (v.0.11.1).Использование HTTP POST с помощью java-команд и jing-команд js

+0

https://stackoverflow.com/a/46927923/3966458 без AJAX –

ответ

8

Мне потребовалось много страданий и экспериментов, чтобы получить это. В последней версии (v.0.11.1) есть опция transport, вы можете использовать ее для делегирования на все, что хотите (веб-узлы или простой старый $.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

и вы можете легко переопределить type в obj

obj.type = 'POST'

Надеется, что это помогает ...