閒來無事,總結這幾天遇到的一個問題,以及解決過程。
這幾天在做一個考覈項目,拿到需求以後,那就敲代碼啊。敲完一個修改功能的時候,測試的時候,突然跳出來這樣一個提示框。
請求參數中Token不存在, what,什麼鬼。
沒辦法,有問題那就去解決唄。
首先我就查看我自己的代碼有沒有寫錯,於是各種debugger;各種設斷點調試。
好吧,數據正常傳到後臺去了。說明我的代碼是沒問題的。
那怎麼辦,遇到問題那就百度一下唄。
搜了一下,百度上沒有我想的問題結果。
我就不信了,百度找不到。那我就試試科學上網唄。
不好意思,還是沒有。
懵bi中
。。。
好吧,鬱悶完了,問題還是得解決。
於是,我就想,這是不是框架中自定義的東西呢。
好吧,查一下官方文檔。
尼瑪,還真是。尷尬。。。
官方文檔是這樣說的。
原來這個東西是3.5版本以後,爲了防止數據篡改,在進行update數據時,會去校驗token。
並且提供了一個解決辦法,那就是在配置文件中配置sys.security.token.validate=false 即可。
但是這就等於把token驗證給關掉了。但官方文檔下面又說了不建議關閉該功能。。。畢竟數據安全性還是很重要的。
於是心裏十萬個草泥馬在奔騰。
又說不建議關閉該功能,但只給關閉該功能的解決辦法。又沒有說遇到此類問題怎麼解決。。。
難道就此放棄,那是不存在的。
於是,我就去找這個token到底是何方神聖。我打開瀏覽器的調試模式,發現從數據可每次查詢一條數據,這條數據都會帶上這個token,在瀏覽器調試模式下參數爲_token。
那麼我就想,既然提示框說的是請求參數中Token不存在,那我就將這個參數獲得以後回傳到後臺去後臺驗證試試。
於是,問題又來了,怎樣去獲取這個值呢。
既然每條數據都會帶有_token,那就從選中行的數據入手唄。
function getToken() {
var choosegrid = $("#grid").data("kendoGrid");
var selection = choosegrid.selectedDataItems();
for (var i = 0; i < selection.length; i++) {
return selection[i]._token;
}
}
於是就寫了一個方法去獲取它,運氣真好,還真被我拿到了。既然拿到了,就傳到後臺參與驗證唄。
var data = viewModel.model.toJSON();
data._token = token;
先把token加到model裏面去,再通過ajax把整個data傳到後臺。
tenant.set_token(dto.get(i).get_token());
到這裏就應該結束,那就再運行試試唄。
好吧,就是這樣做,問題解決。。。