用戶登錄之webflow配置詳解(二)

Webflow配置文件分析

WEB-INF文件夾下的login-webflow.xml是登陸流程的主要配置文件。在該文件中,定義了用戶登錄的整個處理流程。

首先,配置文件中的 on-start標籤定義了用戶第一次進入流程中的預處理動作。該標籤對應spring中的idinitialFlowSetupActionbean。查看該beanInitialFlowSetupAction)的代碼。該類需要繼承自AbstractActionAbstractAction方法是org.springframework.webflow.action包中的類。是webflow中的基礎類。該類中的doExecute方法是對應處理業務的方法。就猶如servlet中的service方法一樣。該方法的參數是RequestContext對象,該參數是一個流程的容器。該方法從request中獲取TGT,並且構建一個臨時的service對象(不同域註冊的service,詳情見接入系統管理)。並且,將TGTservice放在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 '' &amp;&amp; externalContext.requestParameterMap['gateway'] neq null &amp;&amp; flowScope.service neq null" then="gatewayServicesManagementCheck" else="viewLoginForm" />

    </decision-state>

   

    <!-- 存在TGT,說明用戶已經登陸,測試flowservice是否爲空,不爲空,進入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 '' &amp;&amp; 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,同時檢查是否有警告信息,然後進行重定向到用戶最開始請求的地址。

至此,springMVCwebflow整合以及登錄整個流程已經講解完畢。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章