最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

解析SpringSecurity自定義登錄驗證成功與失敗的結果處理問題

 更新時間:2019年11月20日 08:26:18   作者:字母哥博客  
這篇文章主要介紹了SpringSecurity系列之自定義登錄驗證成功與失敗的結果處理問題,本文通過實例給大家講解的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下

一、需要自定義登錄結果的場景

在我之前的文章中,做過登錄驗證流程的源碼解析。其中比較重要的就是

  • 當我們登錄成功的時候,是由AuthenticationSuccessHandler進行登錄結果處理,默認跳轉到defaultSuccessUrl配置的路徑對應的資源頁面(一般是首頁index.html)。
  • 當我們登錄失敗的時候,是由AuthenticationfailureHandler進行登錄結果處理,默認跳轉到failureUrl配置的路徑對應的資源頁面(一般是登錄頁login.html)。

但是在web應用開發(fā)過程中需求是千變萬化的,有時需要我們針對登錄結果做個性化處理,比如:

  • 我們希望不同的人登陸之后,看到不同的首頁
  • 我們應用是前后端分離的,驗證響應結果是JSON格式數(shù)據(jù),而不是頁面跳轉

以上的這些情況,使用Spring Security作為安全框架的時候,都需要我們使用本節(jié)學到的知識進行自定義的登錄驗證結果處理。

二、自定義登陸成功的結果處理

為了滿足上面的需求,我們該如何去做呢?下面一小節(jié)我們來說明一下。AuthenticationSuccessHandler接口是Security提供的認證成功處理器接口,我們只需要去實現(xiàn)它即可。但是通常來說,我們不會直接去實現(xiàn)AuthenticationSuccessHandler接口,而是繼承SavedRequestAwareAuthenticationSuccessHandler 類,這個類會記住用戶上一次請求的資源路徑,比如:用戶請求books.html,沒有登陸所以被攔截到了登錄頁,當你萬成登陸之后會自動跳轉到books.html,而不是主頁面。

@Component
public class MyAuthenticationSuccessHandler 
            extends SavedRequestAwareAuthenticationSuccessHandler {
  //在application配置文件中配置登陸的類型是JSON數(shù)據(jù)響應還是做頁面響應
  @Value("${spring.security.logintype}")
  private String loginType;
  private static ObjectMapper objectMapper = new ObjectMapper();
  @Override
  public void onAuthenticationSuccess(HttpServletRequest request, 
                    HttpServletResponse response, 
                    Authentication authentication) 
                    throws ServletException, IOException {
    if (loginType.equalsIgnoreCase("JSON")) {
      response.setContentType("application/json;charset=UTF-8");
      response.getWriter().write(objectMapper.writeValueAsString(AjaxResponse.success()));
    } else {
      // 會幫我們跳轉到上一次請求的頁面上
      super.onAuthenticationSuccess(request, response, authentication);
    }
  }
}
  • 在上面的自定義登陸成功處理中,既適應JSON前后端分離的應用登錄結果處理,也適用于模板頁面跳轉應用的登錄結果處理
  • ObjectMapper 是Spring Boot默認集成的JSON數(shù)據(jù)處理類庫Jackson中的類。
  • AjaxResponse是一個自定義的通用的JSON數(shù)據(jù)接口響應類。

三、自定義登錄失敗的結果處理

這里我們同樣沒有直接實現(xiàn)AuthenticationFailureHandler接口,而是繼承SimpleUrlAuthenticationFailureHandler 類。該類中默認實現(xiàn)了登錄驗證失敗的跳轉邏輯,即登陸失敗之后回到登錄頁面。我們可以利用這一點簡化我們的代碼。

@Component
public class MyAuthenticationFailureHandler extends SimpleUrlAuthenticationFailureHandler {
  //在application配置文件中配置登陸的類型是JSON數(shù)據(jù)響應還是做頁面響應
  @Value("${spring.security.logintype}")
  private String loginType;
  private static ObjectMapper objectMapper = new ObjectMapper();
  @Override
  public void onAuthenticationFailure(HttpServletRequest request,
                    HttpServletResponse response, 
                    AuthenticationException exception) 
                    throws IOException, ServletException {
    if (loginType.equalsIgnoreCase("JSON")) {
      response.setContentType("application/json;charset=UTF-8");
      response.getWriter().write(
          objectMapper.writeValueAsString(
              AjaxResponse.error(
                  new CustomException(
                    CustomExceptionType.USER_INPUT_ERROR,
                    "用戶名或密碼存在錯誤,請檢查后再次登錄"))));
    } else {
      response.setContentType("text/html;charset=UTF-8");
      super.onAuthenticationFailure(request, response, exception);
    }
  }
}
  • 在上面的自定義登陸失敗處理中,既適應JSON前后端分離的應用登錄失敗結果處理,也適用于模板頁面跳轉應用的登錄失敗結果處理
  • 登陸失敗之后,將默認跳轉到默認的failureUrl,即登錄界面。

四、配置SecurityConfig

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
  @Resource
  private MyAuthenticationSuccessHandler myAuthenticationSuccessHandler;
  @Resource
  private MyAuthenticationFailureHandler myAuthenticationFailureHandler;
  @Override
  protected void configure(HttpSecurity http) throws Exception {
    http.csrf().disable() //禁用跨站csrf攻擊防御,后面的章節(jié)會專門講解
      .formLogin()
      .successHandler(myAuthenticationSuccessHandler)
      .failureHandler(myAuthenticationFailureHandler)
      .defaultSuccessUrl("/index")//登錄認證成功后默認轉跳的路徑
      .failureUrl("/login.html") //登錄認證是被跳轉頁面
}
  • 將自定義的AuthenticationSuccessHandler和AuthenticationFailureHandler注入到Spring Security配置類中
  • 使用fromlogin模式,配置successHandler和failureHandler。
  • 并且配置defaultSuccessUrl和failureUrl

總結

以上所述是小編給大家介紹的SpringSecurity自定義登錄驗證成功與失敗的結果處理,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉載,煩請注明出處,謝謝!

相關文章

  • java編程 中流對象選取規(guī)律詳解

    java編程 中流對象選取規(guī)律詳解

    下面小編就為大家?guī)硪黄猨ava編程 中流對象選取規(guī)律詳解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • redis redisson 限流器的實例(RRateLimiter)

    redis redisson 限流器的實例(RRateLimiter)

    這篇文章主要介紹了redis redisson 限流器的實例(RRateLimiter),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • 詳解SpringBoot的三種緩存技術(Spring Cache、Layering Cache 框架、Alibaba JetCache 框架)

    詳解SpringBoot的三種緩存技術(Spring Cache、Layering Cache 框架、Alibaba J

    這篇文章主要介紹了SpringBoot的三種緩存技術,幫助大家更好的理解和學習springboot框架,感興趣的朋友可以了解下
    2020-10-10
  • Spring boot通過HttpSessionListener監(jiān)聽器統(tǒng)計在線人數(shù)的實現(xiàn)代碼

    Spring boot通過HttpSessionListener監(jiān)聽器統(tǒng)計在線人數(shù)的實現(xiàn)代碼

    這篇文章主要介紹了Spring boot通過HttpSessionListener監(jiān)聽器統(tǒng)計在線人數(shù)的實現(xiàn)代碼,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2018-02-02
  • Java?IDEA集成開發(fā)工具中英文切換圖文教程

    Java?IDEA集成開發(fā)工具中英文切換圖文教程

    相信很多小伙伴們剛接觸IDEA時,看到一堆英文界面不知道如何下手,這篇文章主要給大家介紹了關于Java?IDEA集成開發(fā)工具中英文切換的相關資料,需要的朋友可以參考下
    2024-04-04
  • Java基礎之文件概述

    Java基礎之文件概述

    這篇文章主要介紹了Java基礎之文件概述,文中有非常詳細的代碼示例,對正在學習java基礎的小伙伴們有一定的幫助,需要的朋友可以參考下
    2021-05-05
  • Java之MyBatis入門詳解

    Java之MyBatis入門詳解

    這篇文章主要介紹了Java之MyBatis入門詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • mybatis實現(xiàn)mapper代理模式的方式

    mybatis實現(xiàn)mapper代理模式的方式

    本文向大家講解mybatis的mapper代理模式,以根據(jù)ide值查詢單條數(shù)據(jù)為例編寫xml文件,通過mapper代理的方式進行講解增刪改查,分步驟給大家講解的很詳細,對mybatis mapper代理模式相關知識感興趣的朋友一起看看吧
    2021-06-06
  • 通過FeignClient調用微服務提供的分頁對象IPage報錯的解決

    通過FeignClient調用微服務提供的分頁對象IPage報錯的解決

    這篇文章主要介紹了通過FeignClient調用微服務提供的分頁對象IPage報錯的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • SpringBoot?2.x整合Log4j2日志的詳細步驟

    SpringBoot?2.x整合Log4j2日志的詳細步驟

    log4j2優(yōu)越的性能其原因在于log4j2使用了LMAX,一個無鎖的線程間通信庫代替了,logback和log4j之前的隊列,并發(fā)性能大大提升,下面這篇文章主要給大家介紹了關于SpringBoot?2.x整合Log4j2日志的相關資料,需要的朋友可以參考下
    2022-10-10

最新評論

郁南县| 伊宁县| 长宁县| 柳林县| 沅陵县| 石屏县| 仁寿县| 塘沽区| 句容市| 松滋市| 确山县| 禹州市| 汨罗市| 张家界市| 子长县| 鄂伦春自治旗| 潞城市| 合阳县| 桃园市| 涿州市| 得荣县| 遂昌县| 新疆| 鲁甸县| 桓台县| 饶阳县| 金堂县| 长泰县| 汾阳市| 建始县| 海城市| 琼海市| 临海市| 靖远县| 石屏县| 阳泉市| 东乌珠穆沁旗| 保定市| 临海市| 桂阳县| 墨竹工卡县|