Spring security如何實(shí)現(xiàn)記錄用戶(hù)登錄時(shí)間功能
一、原理分析
spring security提供了一個(gè)接口 AuthenticationSuccessHandler,該接口中只有一個(gè)方法,用來(lái)進(jìn)行登錄成功后的操作
public interface AuthenticationSuccessHandler { /** * Called when a user has been successfully authenticated. * * @param request the request which caused the successful authentication * @param response the response * @param authentication the <tt>Authentication</tt> object which was created during * the authentication process. */ void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException; }
我們可以通過(guò)實(shí)現(xiàn)該接口來(lái)自定義登錄成功后的操作,但spring security提供了一個(gè)SavedRequestAwareAuthenticationSuccessHandler實(shí)現(xiàn)類(lèi),這個(gè)實(shí)現(xiàn)類(lèi)可以記住用戶(hù)未登錄前要訪問(wèn)的地址,這樣登錄成功后就可以把用戶(hù)再跳轉(zhuǎn)到他想去的頁(yè)面。所以我們一般使用繼承這個(gè)類(lèi)的方式來(lái)實(shí)現(xiàn)自定義登錄后續(xù)操作的功能。
二、實(shí)現(xiàn)方式
2.1 自定義AuthenticationSuccessHandler實(shí)現(xiàn)類(lèi)
自定義AuthenticationSuccessHandler接口的實(shí)現(xiàn)類(lèi),繼承SavedRequestAwareAuthenticationSuccessHandler類(lèi),并加入到spring容器中
@Component("loginSuccessHandler") public class LoginSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler { @Autowired private IUserDao userDao; public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException { //記錄相關(guān)的用戶(hù)信息,如上次登錄時(shí)間 String name = authentication.getName(); userDao.updateLastLonginTime(System.currentTimeMillis(),name); //調(diào)用父類(lèi)的方法把用戶(hù)引導(dǎo)到未登錄前要去的頁(yè)面 super.onAuthenticationSuccess(request,response,authentication); } }
其中remember-me-parameter="remembermeParamater"指定前臺(tái)傳遞的是否rememberme的參數(shù)名,前臺(tái)要傳遞的參數(shù)值是true或false
2.2 在spring-security的配置文件中指定自定義的AuthenticationSuccessHandler
<!--自定義登錄頁(yè)面--> <security:form-login login-page="/login.html" login-processing-url="/login" username-parameter="username" password-parameter="password" authentication-failure-forward-url="/failed.html" default-target-url="/index.html" authentication-success-handler-ref="loginSuccessHandler" />
實(shí)例上就是在定義自定義登錄頁(yè)面的標(biāo)簽內(nèi)指定authentication-success-handler-ref="loginSuccessHandler",其中l(wèi)oginSuccessHandler是自定義的這個(gè)bean在容器中的名稱(chēng)
2.3 測(cè)試
啟動(dòng)工程,進(jìn)行登錄,登錄成功后會(huì)更新用戶(hù)表中的last_login_time字段。
需要注意的是如果是通過(guò)readme進(jìn)行的登錄,不會(huì)更新當(dāng)前用戶(hù)的登錄時(shí)間,只有通過(guò)賬號(hào)密碼登錄時(shí)才會(huì)進(jìn)行更新,也就是只有這時(shí)才會(huì)執(zhí)行這個(gè)onAuthenticationSuccess方法
三、總結(jié)
在用戶(hù)登錄成功后記錄本次登錄相關(guān)的信息,需要繼承spring-security提供的SavedRequestAwareAuthenticationSuccessHandler類(lèi),重寫(xiě)其中的onAuthenticationSuccess方法,在其中進(jìn)行記錄用戶(hù)信息的操作,在方法的最后調(diào)用父類(lèi)的方法把用戶(hù)引導(dǎo)到未登錄前要去的頁(yè)面。
測(cè)試工程代碼的地址:工程示例
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
解決response.setHeader設(shè)置下載文件名無(wú)效的問(wèn)題
這篇文章主要介紹了解決response.setHeader設(shè)置下載文件名無(wú)效的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01Springboot如何實(shí)現(xiàn)Web系統(tǒng)License授權(quán)認(rèn)證
這篇文章主要介紹了Springboot如何實(shí)現(xiàn)Web系統(tǒng)License授權(quán)認(rèn)證,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05Java的Flowable工作流之加簽轉(zhuǎn)簽詳解
這篇文章主要介紹了Java的Flowable工作流之加簽轉(zhuǎn)簽詳解,Flowable是一個(gè)開(kāi)源的工作流引擎,它提供了一套強(qiáng)大的工具和功能,用于設(shè)計(jì)、執(zhí)行和管理各種類(lèi)型的工作流程,需要的朋友可以參考下2023-11-11Spring MVC 中 AJAX請(qǐng)求并返回JSON的示例
本篇文章主要介紹了Spring MVC 中 AJAX請(qǐng)求并返回JSON,具有一定的參考價(jià)值,有興趣的可以了解一下。2017-01-01hashtable桶數(shù)通常會(huì)取一個(gè)素?cái)?shù)分析
這篇文章主要介紹了hashtable桶數(shù)通常會(huì)取一個(gè)素?cái)?shù)分析的相關(guān)資料,需要的朋友可以參考下2016-12-12Java控制臺(tái)版五子棋的簡(jiǎn)單實(shí)現(xiàn)方法
這篇文章主要給大家介紹了關(guān)于Java控制臺(tái)版五子棋的簡(jiǎn)單實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01