1. 程式人生 > >android實現登入一次,之後不需要登入的方法token,session,sharedpreference

android實現登入一次,之後不需要登入的方法token,session,sharedpreference

token生成器
token生成器在這裡使用了一個隨機數來實現,即隨機生成一個數字,即實現token生成,如下所示:
private static final Random random = new Random(System.currentTimeMillis());
public static final String TOKENPARAM = "session-token";

/** 生成一個token */
public static synchronized String generateToken(HttpSession session) {
String s = String.valueOf(random.nextLong());
session.setAttribute(TOKENPARAM, s);
return s;
}
token請求處理action
請求處理action,即接收相應的請求,然後直接返回相對應的token即可,如下即為一個為ajax請求生成token的處理action:
public String generateTokenAjax() {
String token = SessionTokenGenerator.generateToken(ServletActionContext.getRequest().getSession());
AjaxSupport.sendSuccessText(token);
return NONE;
}
token請求攔截標識
攔截標識,即表示哪些方法需要被攔截,這裡可以使用註解來實現,即在要攔截的方法上追加類似@TokenNeed的註解,或者使用配置檔案,將需要攔截的方法列表記錄在配置檔案中,在本文中,使用了一個配置檔案來記錄

token攔截器
token攔截器實現了我們所需要的攔截處理,在當碰到需要攔截的方法請求中,將同步進行token的判斷和處理,並根據處理結果判斷是否該繼續放行或攔截之:

public String intercept(ActionInvocation invocation) throws Exception {
String action = invocation.getProxy().getAction().getClass().getName();
String method = invocation.getProxy().getMethod();
final HttpSession session = ServletActionContext.getRequest().getSession();
if(includeMethodSet.contains(action + "." + method)) {
synchronized(session) {
String paramSessionToken = ServletActionContext.getRequest().getParameter(SessionTokenGenerator.TOKENPARAM);
String sessionSessionToken = (String) session.getAttribute(SessionTokenGenerator.TOKENPARAM);
if(sessionSessionToken == null || paramSessionToken == null || !paramSessionToken.equals(sessionSessionToken))
return fail();
session.removeAttribute(SessionTokenGenerator.TOKENPARAM);
}
}
return invocation.invoke();
}
如上即是判斷處理的方法是否在攔截列表中,如果是,則取得引數中的token,再將其與session中的token相比,如果不一致,則直接返回fail,隨後將其從session中移除。

客戶端token實現
作為客戶端,只需要在進行請求提交之前申請一個token,在請求時,將此token加到請求中即可。在本文中,有一個jquery的ajax方法來處理token請求,隨後在進行ajax請求時將此token一起加入到param。如下即為token的jquery請求
m_ylf.token = function() {
m_ylf.invoke("/token/generateToken",{}, function(re) {
re = re["result"];
window["session-token"] = re;
});
}
即在處理時將接收到的token放到window中,要提交請求時再將其從window中取出,一併提交即可,如下的統一ajax處理方法:

//追加session-token
if(window["session-token"])
param["session-token"] = window["session-token"];
至此,整個防session Token請求即完成

相關推薦

android實現登入之後需要登入方法tokensessionsharedpreference

token生成器 token生成器在這裡使用了一個隨機數來實現,即隨機生成一個數字,即實現token生成,如下所示: private static final Random random = new Random(System.currentTimeMillis()); public static final

google test lcov genhtml 產生覆蓋率xml檔案去除需要的檔案(include)或者包含需要的(source)

接我的上一篇 問題:在產生了.gcno 和 .gcda兩個檔案後,使用lcov -c -d Debug/source/ -o Debug/coverage.info 產生中間檔案coverage.info檔案,然後用genhtml -o output/  Debug/c

spyder打開(閃退)之後心累的恢復歷程

問題描述:anaconda prompt能正常開啟,spyder開啟是蛛網介面能出來,但蛛網介面之後就是白屏狀態,兩三秒之後就閃退了,anaconda 上顯示的錯誤是7692:29420:1108/161925.088:ERROR:broker_win.cc(59)。 著急

HBuilder的擴充套件外掛開發暴露了一個事實:其實實現程式碼實現跨平臺App生成

HBuilder的擴充套件外掛開發,原來並不能生成單獨的外掛jar,而是以原始碼 - 類的形式進行開發,這其實就要求必須使用離線打包。 事實上,開發順序應該是:先弄好離線打包框架,然後在AS裡進行擴充套件外掛開發,才能順利打包釋出。 這樣,其實android和ios平臺同樣是要分別用各自的原生語言開發擴充

關於android TextView在需要較焦點的情況下自動滾動文字實現小技巧

一般情況下,預設情況下,TextView文字設定singleLine、設定 ellipsize屬性為marquee之後,當文字長度超過TextView控制元件的寬度且獲取焦點之後,就會自動滾動文字。那麼,我們現在有一個需求,就是這個文字我需要在TextView沒有獲取焦點,

python3 迴圈遍歷map之後map為空

今天在跟敲書本程式碼的時候,發現map型別的變數經過一次for迴圈遍歷之後,裡面的元素都沒有了,找了一些資料,特此記錄,以作備忘。 我們常常會寫類似於這樣的程式碼: dataSet = [[1,3,4],[2,3,5],[1,2,3,5],[2,5]] num = 0 D

使用quartz實現定時,使用@Scheduled註解實現定時--配置到處使用

在spring中我們可以用task:executor 實現定時執行任務,可以大大的減少像quartz這樣的配置,quartz配置很麻煩,首先要配置我們的spring-content.xml 在xmlns 多加下面的語句 xmlns:task="http

mapreduce讀取到輸入文件的問題

mapreduce 過濾器hdfs上輸入文件所在包含兩個目錄,分別是: /20170503/shoplast/ /20170503/shop/但是我想過濾掉shop,只把shoplast作為輸入故我實現了過濾器如下: public static class Fi

springboot啟動起來的經歷

最新 lips 檢查 boot register cli down 一次 shu 在用eclipse+maven構建一個基本的springboot的web應用時在執行main方法(一個基本的springApplication類)出現Unregistering JMX-exp

ffmpeg錄音文件信息裏面碼率時間丟失的問題。

start .exe erro 生成 bps 界面 思考 isp writer 1.起因   同事在調用錄音控件生成的MP3,在部分瀏覽器中加載失敗,出現彈框提示。    經過同事的對比,發現當文件屬性中比特率 為0kbps,時長為空的時候就會出現上圖這種情況。

android系統又刷ROM簡記(

recover com linu nsf 配置文件 loader ref 編寫 例如 當須要對android系統進行大刀闊斧的改造的時候,應該清晰的了解android各個image的組成才幹做到庖丁解牛。

網頁打開故障處理——無耐的退場

一個 火車 放棄 官網 故障處理 迷茫 影響 其中 垃圾 最近有一辦公室人員打來電話,說他有兩個網頁打不開,那是他工作中必須用的,請我去給處理。  不能影響工作啊。到了一看,確實是打不開。就是火車票的12306購票官網,能進網站,但是點客運服務的時候,就怎麽也沒反應了。換用

記錄Mysql主從同步事故問題於事故解決辦法

count cover counter img 一次 png 過去 stop set 首先在昨天的時候我可能在優化zabbix庫的時候動了庫中的events表。導致了接下來的問題。經過查看未解決前問題呈現如下:我們可以看到從庫與主庫不同步的原因是這個:這個問題的學名叫:外鍵

zabbix啟動成功

ges roc type ffd size fff vpd text color 記一次zabbix啟動不成功

記錄異常 出現支持的 SQL92 標記: 70

錯誤 don 技術 提示 png myba 支持 數據庫 bat MVC加mybatis的項目,調用一個接口時報錯提示如下 查了下具體執行的SQL 看了下沒發現問題,然後復制去數據庫中執行,沒問題,正常執行了 然後懷疑傳參有問題,將參數寫死再試...還是不行 最後度娘一

android 再按退出應用 出現閃屏 重啟

今天測試出來一個bug 再按一次 出現閃屏 重啟   @Override public boolean onKeyDown(int keyCode, KeyEvent event) { switch (keyCode) { case KeyEvent.KEY

如何實現多執行緒?實現多執行緒為什麼要調start是run方法?(繼承Thread類、實現Ruable介面、Callable<V>)

什麼是程序? 作業系統中一個程式的執行週期(從開啟到關閉)。程序是具有一個或多個執行緒的執行緒組。 什麼是執行緒? 一個程序可以同時執行多個任務,任務就是執行緒,一個程序至少有一個執行緒。 執行緒執行在程序內部,執行緒是輕量級程序。 程序和執行緒比較:

記錄dubbo找到service問題Failed to check the status of the service

事實證明,eclipse是一個好的開發工具,但不是一個優秀的開發工具。 呼叫介面的時候一直報Failed to check the status of the service錯誤,提示註冊中心沒有相關的服務。 開始我沒有將生產環境和開發環境的<activation> <ac

Linq實現sql張表資料存在另外張表

Linq中包含查詢 //Linq程式碼: T_WxMaterials.Where(n=>T_VideoMsgs.Select(m=>m.MediaID).Contains(n.MediaID)) //生成的sql語句: SELECT [t0].[ID], [t0].[

Android 許可權管理(那些需要申請許可權哪些需要申請許可權)

6.0許可權的基本知識,以下是需要單獨申請的許可權,共分為9組,每組只要有一個許可權申請成功了,就預設整組許可權都可以使用了。   group:android.permission-group.CONTACTS     permission:android.perm