欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringSecurity退出功能實(shí)現(xiàn)的正確方式(推薦)

 更新時(shí)間:2019年11月25日 08:28:46   作者:字母哥博客  
本文將介紹在Spring Security框架下如何實(shí)現(xiàn)用戶的"退出"logout的功能。本文通過實(shí)例代碼講解的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧

spring security 簡(jiǎn)介

        spring security 的核心功能主要包括:

  • 認(rèn)證 (你是誰)
  • 授權(quán) (你能干什么)
  • 攻擊防護(hù) (防止偽造身份)

     其核心就是一組過濾器鏈,項(xiàng)目啟動(dòng)后將會(huì)自動(dòng)配置。最核心的就是 Basic Authentication Filter 用來認(rèn)證用戶的身份,一個(gè)在spring security中一種過濾器處理一種認(rèn)證方式。

本文將介紹在Spring Security框架下如何實(shí)現(xiàn)用戶的"退出"logout的功能。其實(shí)這是一個(gè)非常簡(jiǎn)單的功能,我見過很多的程序員在使用了Spring Security之后,仍然去自己寫controller方法實(shí)現(xiàn)logout功能,這種做法就好像耕地,你有機(jī)械設(shè)備你不用,你非要用牛。

一、logout最簡(jiǎn)及最佳實(shí)踐

其實(shí)使用Spring Security進(jìn)行l(wèi)ogout非常簡(jiǎn)單,只需要在spring Security配置類配置項(xiàng)上加上這樣一行代碼:http.logout()。關(guān)于spring Security配置類的其他很多實(shí)現(xiàn)、如:HttpBasic模式、formLogin模式、自定義登錄驗(yàn)證結(jié)果、使用權(quán)限表達(dá)式、session會(huì)話管理,在本號(hào)的之前的文章已經(jīng)都寫過了。本節(jié)的核心內(nèi)容就是在原有配置的基礎(chǔ)上,加上這樣一行代碼:http.logout()。

@Configuration
@EnableWebSecurity
public class SecSecurityConfig extends WebSecurityConfigurerAdapter {
  @Override
  protected void configure(final HttpSecurity http) throws Exception {
    http.logout();
  }
}

加上logout配置之后,在你的“退出”按鈕上使用/logtou作為請(qǐng)求登出的路徑。

<a href="/logout" rel="external nofollow" >退出</a>

logout功能我們就完成了。實(shí)際上的核心代碼只有兩行。

二、默認(rèn)的logout做了什么?

雖然我們簡(jiǎn)簡(jiǎn)單單的實(shí)現(xiàn)了logout功能,是不是還不足夠放心?我們下面就來看一下Spring Security默認(rèn)在logout過程中幫我們做了哪些動(dòng)作。

  • 當(dāng)前session失效,即:logout的核心需求,session失效就是訪問權(quán)限的回收。
  • 刪除當(dāng)前用戶的 remember-me“記住我”功能信息
  • clear清除當(dāng)前的 SecurityContext
  • 重定向到登錄頁面,loginPage配置項(xiàng)指定的頁面

通常對(duì)于一個(gè)應(yīng)用來講,以上動(dòng)作就是logout功能所需要具備的功能了。

三、個(gè)性化配置

雖然Spring Security默認(rèn)使用了/logout作為退出處理請(qǐng)求路徑,登錄頁面作為退出之后的跳轉(zhuǎn)頁面。這符合絕大多數(shù)的應(yīng)用的開發(fā)邏輯,但有的時(shí)候我們需要一些個(gè)性化設(shè)置,如下:

 http.logout()
   .logoutUrl("/signout")
   .logoutSuccessUrl("/aftersignout.html")
   .deleteCookies("JSESSIONID")

  • 通過指定logoutUrl配置改變退出請(qǐng)求的默認(rèn)路徑,當(dāng)然html退出按鈕的請(qǐng)求url也要修改
  • 通過指定logoutSuccessUrl配置,來顯式指定退出之后的跳轉(zhuǎn)頁面
  • 還可以使用deleteCookies刪除指定的cookie,參數(shù)為cookie的名稱

四、LogoutSuccessHandler

如果上面的個(gè)性化配置,仍然滿足不了您的應(yīng)用需求??赡苣膽?yīng)用需要在logout的時(shí)候,做一些特殊動(dòng)作,比如登錄時(shí)長(zhǎng)計(jì)算,清理業(yè)務(wù)相關(guān)的數(shù)據(jù)等等。你可以通過實(shí)現(xiàn)LogoutSuccessHandler 接口來實(shí)現(xiàn)你的業(yè)務(wù)邏輯。

@Component
public class MyLogoutSuccessHandler implements LogoutSuccessHandler {
  
  @Override
  public void onLogoutSuccess(HttpServletRequest request, 
                HttpServletResponse response, 
                Authentication authentication) 
                throws IOException, ServletException {
    //這里書寫你自己的退出業(yè)務(wù)邏輯
    
    // 重定向到登錄頁
    response.sendRedirect("/login.html");
  }
}

然后進(jìn)行配置使其生效,核心代碼就是一行l(wèi)ogoutSuccessHandler。注意logoutSuccessUrl不要與logoutSuccessHandler一起使用,否則logoutSuccessHandler將失效。

@Configuration
@EnableWebSecurity
public class SecSecurityConfig extends WebSecurityConfigurerAdapter {
  
@Autowired
  private MyLogoutSuccessHandler myLogoutSuccessHandler;

  @Override
  protected void configure(final HttpSecurity http) throws Exception {
     http.logout()
       .logoutUrl("/signout")
       //.logoutSuccessUrl(``"/aftersignout.html"``)
       .deleteCookies("JSESSIONID")
       //自定義logoutSuccessHandler
       .logoutSuccessHandler(myLogoutSuccessHandler);  
  }
}

總結(jié)

以上所述是小編給大家介紹的SpringSecurity退出功能實(shí)現(xiàn)的正確方式,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!

相關(guān)文章

  • Java統(tǒng)計(jì)英文句子中出現(xiàn)次數(shù)最多的單詞并計(jì)算出現(xiàn)次數(shù)的方法

    Java統(tǒng)計(jì)英文句子中出現(xiàn)次數(shù)最多的單詞并計(jì)算出現(xiàn)次數(shù)的方法

    這篇文章主要介紹了Java統(tǒng)計(jì)英文句子中出現(xiàn)次數(shù)最多的單詞并計(jì)算出現(xiàn)次數(shù)的方法,涉及java針對(duì)英文句子的字符串遍歷、轉(zhuǎn)換、正則替換、計(jì)算等相關(guān)操作技巧,需要的朋友可以參考下
    2018-01-01
  • Java中的對(duì)象、類、抽象類、接口、繼承之間的聯(lián)系

    Java中的對(duì)象、類、抽象類、接口、繼承之間的聯(lián)系

    這篇文章主要介紹了Java中的對(duì)象、類、抽象類、接口、繼承之間的聯(lián)系,文章講解的很清晰,有不太懂的同學(xué)可以多研究下
    2021-02-02
  • Java使用Condition實(shí)現(xiàn)精準(zhǔn)喚醒線程詳解

    Java使用Condition實(shí)現(xiàn)精準(zhǔn)喚醒線程詳解

    這篇文章主要為大家詳細(xì)介紹了Java如何使用Condition實(shí)現(xiàn)精準(zhǔn)喚醒線程效果,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下
    2023-02-02
  • Java正則表達(dá)式matcher.group()用法代碼

    Java正則表達(dá)式matcher.group()用法代碼

    這篇文章主要給大家介紹了關(guān)于Java正則表達(dá)式matcher.group()用法的相關(guān)資料,最近在做一個(gè)項(xiàng)目,需要使用matcher.group()方法匹配出需要的內(nèi)容,文中給出了詳細(xì)的代碼示例,需要的朋友可以參考下
    2023-08-08
  • Java實(shí)現(xiàn)FIFO任務(wù)調(diào)度隊(duì)列策略

    Java實(shí)現(xiàn)FIFO任務(wù)調(diào)度隊(duì)列策略

    在工作中,很多高并發(fā)的場(chǎng)景中,我們會(huì)用到隊(duì)列來實(shí)現(xiàn)大量的任務(wù)請(qǐng)求。當(dāng)任務(wù)需要某些特殊資源的時(shí)候,我們還需要合理的分配資源,讓隊(duì)列中的任務(wù)高效且有序完成任務(wù)。本文將為大家介紹通過java實(shí)現(xiàn)FIFO任務(wù)調(diào)度,需要的可以參考一下
    2021-12-12
  • 詳解Java如何實(shí)現(xiàn)一個(gè)BlockingQueue

    詳解Java如何實(shí)現(xiàn)一個(gè)BlockingQueue

    這篇文章主要為大家詳細(xì)介紹了Java如何實(shí)現(xiàn)一個(gè)BlockingQueue阻塞隊(duì)列,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-06-06
  • SpringBoot整合MongoDB完整實(shí)例代碼

    SpringBoot整合MongoDB完整實(shí)例代碼

    本文主要介紹了SpringBoot整合MongoDB完整實(shí)例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Mybatis-Plus批量插入用法詳解

    Mybatis-Plus批量插入用法詳解

    mybatis-plus的IService接口默認(rèn)提供saveBatch批量插入,也是唯一一個(gè)默認(rèn)批量插入,在數(shù)據(jù)量不是很大的情況下可以直接使用,但這種是一條一條執(zhí)行的效率上會(huì)有一定的瓶頸,今天我們就來研究研究mybatis-plus中的批量插入
    2023-02-02
  • Java服務(wù)限流算法的6種實(shí)現(xiàn)

    Java服務(wù)限流算法的6種實(shí)現(xiàn)

    服務(wù)限流是指通過控制請(qǐng)求的速率或次數(shù)來達(dá)到保護(hù)服務(wù)的目的,本文主要介紹了Java服務(wù)限流算法的6種實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-05-05
  • Java并發(fā)編程之代碼實(shí)現(xiàn)兩玩家交換裝備

    Java并發(fā)編程之代碼實(shí)現(xiàn)兩玩家交換裝備

    這篇文章主要介紹了Java并發(fā)編程之代碼實(shí)現(xiàn)兩玩家交換裝備,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有一定的幫助,需要的朋友可以參考下
    2021-09-09

最新評(píng)論