本案例是使用的簡單token作為驗證;而token與使用者資訊會儲存在redis中;
簡單說明一下本案例的一些邏輯,可能存在某些漏洞,希望大家指正;
使用者未登入時,訪問系統中任意controller方法都將跳轉至登入頁面;
使用者使用url訪問系統中任意頁面(我們是將頁面放在了web-inf之外的)都將跳轉至登入頁面;
使用者已登入,每次請求伺服器,將token超時時間延後30分鐘;
使用者已登入,訪問登入頁面都將跳轉至已登入的首頁;
session超時將清除redis中token,平台的token超時將清除session中所有資訊;
使用者登出,清除session資訊,清除redis中的token資訊;
redis相關**:
jedis連線池:
public class jedisclientpool
static
//初始化jedispool物件;
private static void initjedispool()
//初始化jedispoolconfig物件;
private static jedispoolconfig initpoolconfig()
//單例模式,確保系統中只有乙個jedis連線池;
public static jedisclientpool getinstance()}}
return jedisclientpool;
}//獲取jedis連線,可以在返回連線之前做密碼驗證;
public jedis getresource()
//歸還連線給連線池;
public void returnresource(jedis jedis)
}
操作redis的工具類:
public class rediscache
/*** 歸還乙個連線給redis連線池
* @param jedis
*/private static void returnjedis(jedis jedis)
/*** 判斷redis中該key是否存在
* @param key
* @return
*/public static boolean exists(final string key)
/*** 獲取redis中指定key的值
* @param key
* @return
*/public static string get(string key)
/*** 向redis中設定一對key-value
* @param key
* @param value
*/public static void set(string key ,string value)
/*** 刪除redis中指定的key
* @param key
*/public static void del(string key)
/*** 為redis中指定key設定超時時間
* @param key
* @param seconds
*/public static void expire(string key,int seconds)
}
redis相關已經完畢,接下來就是過濾器的一些規則:
token過濾器,由於我們使用的是nutz框架,所以繼承的是框架內的filter,返回也不一樣,但是對於session和token的驗證還是可以復用到其他過濾器中;
public class tokenfilter implements actionfilter
string authorization = (string) session.getattribute("authorization");
if(strutil.isblank(authorization))else
}//session中存在token,去redis中驗證
boolean exists = rediscache.exists(authorization);
if(!exists)else
return null;
}}
由於我們的頁面時放在web-inf之外,所以需要乙個靜態資源過濾器:
public class staticfilter implements filter
@override
public void init(filterconfig filterconfig) throws servletexception
@override
public void dofilter(servletrequest request, servletresponse response, filterchain chain) throws ioexception, servletexception
if(lastindexof == -1)else
}//如果沒有token,則對html和jsp的直接訪問url進行攔截
if(strutil.isblank(token))else
if("jsp".equals(suffix)||"html".equals(suffix))}}
}chain.dofilter(request,response);
}@override
public void destroy()
}
token(uuid)生成器:
public class uuidfactory
/*** 獲取乙個指定長度的uuid
* @param length
* @return
*/public static string getuuid(int length)
}
web.xml配置(注意,如果tokenfilter是實現的filter則也要在web.xml中配置)
staticfilter
com.***x.***x.***x.staticfilter
/*com.***x.***x.***x.dlxsessionlistener
簡單登入切換案例
doctype html html lang en head meta charset utf 8 meta name viewport content width device width,initial scale 1.0 title 登入切換 title head style style bo...
單點登入系統簡單實現
最近要做單點登入系統,網上參考了一下,就是得整個授權服務,其他需要進行單點登入的應用的授權,登出都通過該授權服務來決定,然後就是一處登入,處處登入 一次登出,處處登出。簡單說明實現原理 2.譬如現有驗證應用a,需要進行單點登入的系統s1,s2。現在s1需要進行登入驗證,首先會考慮s1本身的身份驗證,...
17 登入案例
使用session技術,主頁面只有使用者名稱和密碼 使用者主頁的邏輯 2.取出會話資料 string loginname string session.getattribute loginname if loginname null html 歡迎回來,loginname request.getco...