在整個學習過程當中,我最關心的內容有號幾點,其中一點是【先後端分離的狀況下如何不跳轉頁面而是返回須要的返回值】。
下面就說一下學習結果,以xml配置位李。html
在spring官方文檔5.0.12.RELEASE第6.2.3節,有這麼一段描述:spring
要進一步控制目標,能夠使用authentication-success-handler-ref屬性做爲default-target-url的替代。 引用的bean應該是AuthenticationSuccessHandler的一個實例。 您能夠在Core Filters一章以及命名空間附錄中找到更多相關信息,以及有關如何在身份驗證失敗時自定義流的信息。
剛開始的時候我沒有注意到這個內容,後來看了spring-security-5.0.xsd文件才找到這個配置。
在xsd文件中,對這個屬性是這樣描述的:json
<xs:attribute name="authentication-success-handler-ref" type="xs:token"> <xs:annotation> <xs:documentation> 引用應該用於處理a的AuthenticationSuccessHandler bean成功的認證請求。 不該與之配合使用default-target-url(或always-use-default-target-url)應始終做爲實現處理導航到後續目的地 </xs:documentation> </xs:annotation> </xs:attribute>
因此實現一個AuthenticationSuccessHandler的實現類:後端
public class LoginAuthenticationSuccessHandler implements AuthenticationSuccessHandler { @Override public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException { System.out.println("===========登錄成功================"); PrintWriter printWriter = response.getWriter(); Map<String, String> msgMap = new HashMap<>(); msgMap.put("result", "0"); msgMap.put("msg", "登陸成功"); printWriter.write(new Gson().toJson(msgMap)); printWriter.flush(); printWriter.close(); } }
配置xml:cookie
<security:http> <security:intercept-url pattern="/**" access="isAuthenticated()"/> <security:form-login authentication-success-handler-ref="loginAuthenticationSuccessHandler"/> <security:logout delete-cookies="JSESSIONID" invalidate-session="true" success-handler-ref="myLogoutSuccessHandler"/> <security:csrf disabled="true"/> </security:http> ...... <bean id="loginAuthenticationSuccessHandler" class="com.nyl.securitylearn.security.handler.LoginAuthenticationSuccessHandler"/>
測試結果:
session
在spring官方文檔5.0.12.RELEASE第6.2.4 logout handling節,提到這個內容:app
logout元素經過導航到特定URL添加了對註銷的支持。 默認的註銷URL是/logout,但您能夠使用logout-url屬性將其設置爲其餘內容。 有關其餘可用屬性的更多信息,請參見命名空間附錄。
查找到對應的命名空間章節43.1.26 <logout>,其中關於配置的說明:前後端分離
//這個說明 success-handler-ref success-handler-ref May be used to supply an instance of LogoutSuccessHandler which will be invoked to control the navigation after logging out.
根聽說明須要實現LogoutSuccessHandler接口。ide
實現一個LogoutSuccessHandler的實現類:學習
public class MyLogoutSuccessHandler implements LogoutSuccessHandler { @Override public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException { System.out.println("===========登出成功================"); PrintWriter printWriter = response.getWriter(); response.setHeader("Content-Type", "application/json;charset=utf8"); Map<String, String> msgMap = new HashMap<>(); msgMap.put("result", "0"); msgMap.put("msg", "退出成功"); printWriter.write(new Gson().toJson(msgMap)); printWriter.flush(); printWriter.close(); } }
配置xml:
<context:component-scan base-package="com.nyl.securitylearn"/> <security:http> <security:intercept-url pattern="/**" access="isAuthenticated()"/> <security:form-login authentication-success-handler-ref="loginAuthenticationSuccessHandler"/> <security:logout delete-cookies="JSESSIONID" invalidate-session="true" success-handler-ref="myLogoutSuccessHandler"/> <security:csrf disabled="true"/> </security:http>
測試:
在43.1.21 <form-login>節中,提到了這樣一個配置authentication-failure-handler-ref :
authentication-failure-handler-ref 可用做authentication-failure-url的替代方法,使您能夠在身份驗證失敗後徹底控制導航流。 該值應該是應用程序上下文中AuthenticationFailureHandler bean的名稱。
xsd中的說明:
引用應該用於處理失敗的AuthenticationFailureHandler bean驗證請求。 不該與authentication-failure-url結合使用, 由於實現應始終處理導航到後續目的地
測試配置基本和登陸成功一致,不囉嗦了。
這樣就實現了基本的先後端調用要求,避免了路徑跳轉。