Spring security如何實現(xiàn)記錄用戶登錄時間功能
一、原理分析
spring security提供了一個接口 AuthenticationSuccessHandler,該接口中只有一個方法,用來進行登錄成功后的操作
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;
}
我們可以通過實現(xiàn)該接口來自定義登錄成功后的操作,但spring security提供了一個SavedRequestAwareAuthenticationSuccessHandler實現(xiàn)類,這個實現(xiàn)類可以記住用戶未登錄前要訪問的地址,這樣登錄成功后就可以把用戶再跳轉(zhuǎn)到他想去的頁面。所以我們一般使用繼承這個類的方式來實現(xiàn)自定義登錄后續(xù)操作的功能。
二、實現(xiàn)方式
2.1 自定義AuthenticationSuccessHandler實現(xiàn)類
自定義AuthenticationSuccessHandler接口的實現(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)的用戶信息,如上次登錄時間
String name = authentication.getName();
userDao.updateLastLonginTime(System.currentTimeMillis(),name);
//調(diào)用父類的方法把用戶引導(dǎo)到未登錄前要去的頁面
super.onAuthenticationSuccess(request,response,authentication);
}
}
其中remember-me-parameter="remembermeParamater"指定前臺傳遞的是否rememberme的參數(shù)名,前臺要傳遞的參數(shù)值是true或false
2.2 在spring-security的配置文件中指定自定義的AuthenticationSuccessHandler
<!--自定義登錄頁面-->
<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"
/>
實例上就是在定義自定義登錄頁面的標簽內(nèi)指定authentication-success-handler-ref="loginSuccessHandler",其中l(wèi)oginSuccessHandler是自定義的這個bean在容器中的名稱
2.3 測試
啟動工程,進行登錄,登錄成功后會更新用戶表中的last_login_time字段。

需要注意的是如果是通過readme進行的登錄,不會更新當(dāng)前用戶的登錄時間,只有通過賬號密碼登錄時才會進行更新,也就是只有這時才會執(zhí)行這個onAuthenticationSuccess方法
三、總結(jié)
在用戶登錄成功后記錄本次登錄相關(guān)的信息,需要繼承spring-security提供的SavedRequestAwareAuthenticationSuccessHandler類,重寫其中的onAuthenticationSuccess方法,在其中進行記錄用戶信息的操作,在方法的最后調(diào)用父類的方法把用戶引導(dǎo)到未登錄前要去的頁面。
測試工程代碼的地址:工程示例
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
JAVA動態(tài)代理模式(從現(xiàn)實生活角度理解代碼原理)
本文主要介紹了JAVA動態(tài)代理模式(從現(xiàn)實生活角度理解代碼原理)的相關(guān)知識。具有很好的參考價值。下面跟著小編一起來看下吧2017-03-03
關(guān)于idea引入spring boot <parent></parent>父依賴標紅問題
這篇文章主要介紹了idea引入spring boot <parent></parent>父依賴標紅問題,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-10-10
java實現(xiàn)/創(chuàng)建線程的幾種方式小結(jié)
在JAVA中,用Thread類代表線程,所有線程對象都必須是Thread類或者Thread類子類的實例,下面這篇文章主要介紹了java實現(xiàn)/創(chuàng)建線程的幾種方式,需要的朋友可以參考下2021-08-08
java中synchronized關(guān)鍵字的3種寫法實例
synchronized是Java中的關(guān)鍵字,是一種同步鎖,下面這篇文章主要給大家介紹了關(guān)于java中synchronized關(guān)鍵字的3種寫法,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下2021-11-11

