Webflow配置文件分析
在WEB-INF文件夾下的login-webflow.xml是登陸流程的主要配置文件。在該文件中,定義了用戶登錄的整個處理流程。
首先,配置文件中的 on-start標籤定義了用戶第一次進入流程中的預處理動作。該標籤對應spring中的id爲initialFlowSetupAction的bean。查看該bean(InitialFlowSetupAction)的代碼。該類需要繼承自AbstractAction,AbstractAction方法是org.springframework.webflow.action包中的類。是webflow中的基礎類。該類中的doExecute方法是對應處理業務的方法。就猶如servlet中的service方法一樣。該方法的參數是RequestContext對象,該參數是一個流程的容器。該方法從request中獲取TGT,並且構建一個臨時的service對象(不同域註冊的service,詳情見接入系統管理)。並且,將TGT和service放在FlowScope作用域中。
流程的初始化完畢之後,就開始一系列的判斷了。也就是進入decision-state節點。這些節點是依次執行的。
<!-- 檢查flow中是否存在TGT如果存在,存在進入hasServiceCheck,爲空進入gatewayRequestCheck -->
<decision-state id="ticketGrantingTicketExistsCheck">
<if test="flowScope.ticketGrantingTicketId neq null" then="hasServiceCheck" else="gatewayRequestCheck" />
</decision-state>
<!-- 主要是CS結構使用gatewat,暫時不研究 -->
<decision-state id="gatewayRequestCheck">
<if test="externalContext.requestParameterMap['gateway'] neq '' && externalContext.requestParameterMap['gateway'] neq null && flowScope.service neq null" then="gatewayServicesManagementCheck" else="viewLoginForm" />
</decision-state>
<!-- 存在TGT,說明用戶已經登陸,測試flow中service是否爲空,不爲空,進入renewRequestCheck,爲空,進入viewGenericLoginSuccess -->
<decision-state id="hasServiceCheck">
<if test="flowScope.service != null" then="renewRequestCheck" else="viewGenericLoginSuccess" />
</decision-state>
<!--
用戶已經登陸,且請求參數中存在service 判斷請求中是否存在'renew'參數,如果renew參數爲空或者沒有內容,那麼,進入viewLoginForm,否則進入generateServiceTicket
renew參數和gateway參數不兼容。renew參數將繞過單點登錄。也就是說即使用戶登錄了,還將要求用戶登錄。(等你妹啊,人家都登錄了,憑什麼還要讓人家再登錄一次)
-->
<decision-state id="renewRequestCheck">
<if test="externalContext.requestParameterMap['renew'] neq '' && externalContext.requestParameterMap['renew'] neq null" then="viewLoginForm" else="generateServiceTicket" />
</decision-state>
<decision-state id="warn">
<if test="flowScope.warnCookieValue" then="showWarningView" else="redirect" />
</decision-state>
對應的dicision-state走完之後,如果不存在TGT,其實就會進入voiwLoginForm節點。該節點是一個view-state類型的,這也就是說明該節點是一個頁面,view=“casLoginView”屬性定義了該view對應的頁面是“casLoginView”。這個視圖會被spring的視圖解析器解析成/WEB-INF/view/jsp/default/ui/casLoginView.jsp頁面。用戶這時候就能看到一個登陸界面了。
需要注意的是,用戶看到的登錄界面中,會有hidden類型的一個lt參數:
<input type="hidden" name="lt" value="${flowExecutionKey}" />
該參數可以理解成每個需要登錄的用戶都有一個流水號。只有有了webflow發放的有效的流水號,用戶纔可以說明是已經進入了webflow流程。否則,沒有流水號的情況下,webflow會認爲用戶還沒有進入webflow流程,從而會重新進入一次webflow流程,從而會重新出現登錄界面。
用戶點擊登錄之後,提交到realSubmit節點。該節點執行的是authenticationViaFormAction.submit方法,在該方法中,將會驗證用戶的認證信息是否正確。驗證成功之後,跳轉到sendTicketGrantingTicket,在這裏,將生成TGT,然後,進入serviceCheck,在serviceCheck中,將會驗證flowScope作用域中是否存在service,如果存在,則進入generateServiceTicket,否則進入登錄成功頁面。在generateServiceTicket中,也將生成ST,同時檢查是否有警告信息,然後進行重定向到用戶最開始請求的地址。
至此,springMVC與webflow整合以及登錄整個流程已經講解完畢。