簡單的系統登入案例

2021-08-20 13:08:37 字數 3136 閱讀 9276

本案例是使用的簡單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...