Spring security如何實(shí)現(xiàn)記錄用戶登錄時(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)類,這個(gè)實(shí)現(xiàn)類可以記住用戶未登錄前要訪問(wèn)的地址,這樣登錄成功后就可以把用戶再跳轉(zhuǎn)到他想去的頁(yè)面。所以我們一般使用繼承這個(gè)類的方式來(lái)實(shí)現(xiàn)自定義登錄后續(xù)操作的功能。
二、實(shí)現(xiàn)方式
2.1 自定義AuthenticationSuccessHandler實(shí)現(xiàn)類
自定義AuthenticationSuccessHandler接口的實(shí)現(xiàn)類,繼承SavedRequestAwareAuthenticationSuccessHandler類,并加入到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)的用戶信息,如上次登錄時(shí)間
String name = authentication.getName();
userDao.updateLastLonginTime(System.currentTimeMillis(),name);
//調(diào)用父類的方法把用戶引導(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在容器中的名稱
2.3 測(cè)試
啟動(dòng)工程,進(jìn)行登錄,登錄成功后會(huì)更新用戶表中的last_login_time字段。

需要注意的是如果是通過(guò)readme進(jìn)行的登錄,不會(huì)更新當(dāng)前用戶的登錄時(shí)間,只有通過(guò)賬號(hào)密碼登錄時(shí)才會(huì)進(jìn)行更新,也就是只有這時(shí)才會(huì)執(zhí)行這個(gè)onAuthenticationSuccess方法
三、總結(jié)
在用戶登錄成功后記錄本次登錄相關(guān)的信息,需要繼承spring-security提供的SavedRequestAwareAuthenticationSuccessHandler類,重寫其中的onAuthenticationSuccess方法,在其中進(jìn)行記錄用戶信息的操作,在方法的最后調(diào)用父類的方法把用戶引導(dǎo)到未登錄前要去的頁(yè)面。
測(cè)試工程代碼的地址:工程示例
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
JAVA動(dòng)態(tài)代理模式(從現(xiàn)實(shí)生活角度理解代碼原理)
本文主要介紹了JAVA動(dòng)態(tài)代理模式(從現(xiàn)實(shí)生活角度理解代碼原理)的相關(guān)知識(shí)。具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧2017-03-03
學(xué)習(xí)Java之如何對(duì)時(shí)間進(jìn)行格式化
當(dāng)我們?cè)谀J(rèn)情況下構(gòu)造出來(lái)的時(shí)間對(duì)象,它的時(shí)間格式并不適合我們閱讀,并且在開(kāi)發(fā)時(shí),pc端、Android端、iOS端等展示的時(shí)間格式可能也并不完全一樣,本文就從這幾個(gè)問(wèn)題給大家介紹如何對(duì)時(shí)間進(jìn)行格式化,感興趣的同學(xué)可以借鑒一下2023-05-05
關(guān)于idea引入spring boot <parent></parent>父依賴標(biāo)紅問(wèn)題
這篇文章主要介紹了idea引入spring boot <parent></parent>父依賴標(biāo)紅問(wèn)題,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10
spring?Bean創(chuàng)建的完整過(guò)程記錄
這篇文章主要給大家介紹了關(guān)于Spring中Bean實(shí)例創(chuàng)建的相關(guān)資料,文中通過(guò)實(shí)例代碼和圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-01-01
java實(shí)現(xiàn)/創(chuàng)建線程的幾種方式小結(jié)
在JAVA中,用Thread類代表線程,所有線程對(duì)象都必須是Thread類或者Thread類子類的實(shí)例,下面這篇文章主要介紹了java實(shí)現(xiàn)/創(chuàng)建線程的幾種方式,需要的朋友可以參考下2021-08-08
java過(guò)濾器中Filter的ChainFilter過(guò)濾鏈
這篇文章主要介紹了java過(guò)濾器中Filter的ChainFilter過(guò)濾鏈,發(fā)送請(qǐng)求時(shí),如果有不符合的信息將會(huì)被filter進(jìn)行攔截,如果符合則會(huì)進(jìn)行放行。如果感興趣可以來(lái)學(xué)習(xí)一下2020-07-07
java中synchronized關(guān)鍵字的3種寫法實(shí)例
synchronized是Java中的關(guān)鍵字,是一種同步鎖,下面這篇文章主要給大家介紹了關(guān)于java中synchronized關(guān)鍵字的3種寫法,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2021-11-11

