http://blog.csdn.net/yaoweijq/article/details/6044941
login-webflow是当你在浏览器里面输入https://localhost:8080/cas/login?param_list
后,cas server端如何处理的.
它实际上是spring-webflow的应用,有关spring-webflow的详细介绍,网上铺天盖地,我就不啰嗦了 --------------------------------------- cas server端的web.xml文件里面有
<servlet> <servlet-name>cas</servlet-name> <servlet-class> org.jasig.cas.web.init.SafeDispatcherServlet </servlet-class> <init-param> <param-name>publishContext</param-name> <param-value>false</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet>
这个是login-webflow的入口servlet,映射的url-pattern之一就是
<servlet-mapping> <servlet-name>cas</servlet-name> <url-pattern>/login</url-pattern> </servlet-mapping>
即login --------------------------------------------- spring webflow必须在flow-registry里面注册,
这个是在cas-servlet.xml里面注册的
<webflow:flow-registry id="flowRegistry" flow-builder-services="builder"> <webflow:flow-location path="/WEB-INF/login-webflow.xml" id="login" /> </webflow:flow-registry>
这句话把login-webflow.xml进行了注册 -------------------------------------------- 同时呢
对应的view properties在propertyFileConfigurer.xml中指定了
<bean id="propertyPlaceholderConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" p:location="/WEB-INF/cas.properties" />
打开cas.properties
cas.themeResolver.defaultThemeName=default cas.viewResolver.basename=default_views
对应了default.properties
default_views.properties
这两个properties里面放了对应的css js 和jsp的路径,大家一定要注意。
OK,基本的配置就是这些, ----------------------------------------------- 下面我们重点来关注下login-webflow.xml
里面是一个具体的spring webflow流程
涉及到的结点有on-start 流程开始
end-state流程结束 decision-state判断,类似于if
view-state对应jsp页面 action-state对应执行程序的某段
里面的<evaluate expression="initialFlowSetupAction" />这些定义在cas-servlet.xml中
view-state里面的view定义在default_views.properties中 ------------------------------------------ 下面简单介绍下里面的语句说明
<evaluate expression="initialFlowSetupAction" />
这句话的意思是执行
org.jasig.cas.web.flow.InitialFlowSetupAction中的doExecute方法
其中的变量都由spring注入了
具体看对应的配置文件 ------------------------------------- 然后下一个流程是
<decision-state id="ticketGrantingTicketExistsCheck"> <if test="flowScope.ticketGrantingTicketId neq null" then="hasServiceCheck" else="gatewayRequestCheck" /> </decision-state>
进行判断
flowScope.ticketGrantingTicketId
这个在org.jasig.cas.web.flow.InitialFlowSetupAction中由
context.getFlowScope().put( "ticketGrantingTicketId", this.ticketGrantingTicketCookieGenerator.retrieveCookieValue(request));
这句话放入了,然后在这儿进行检测neq null是不为null的意思
then else都很好理解 --------------------------------- view state
<view-state id="viewLoginForm" view="casLoginView" model="credentials"> <var name="credentials" class="org.jasig.cas.authentication.principal.UsernamePasswordCredentials" /> <binder> <binding property="username" /> <binding property="password" /> </binder> <on-entry> <set name="viewScope.commandName" value="'credentials'" /> </on-entry> <transition on="submit" bind="true" validate="true" to="realSubmit"> <set name="flowScope.credentials" value="credentials" /> <evaluate expression="authenticationViaFormAction.doBind(flowRequestContext, flowScope.credentials)" /> </transition> </view-state>
对应的是casLoginView.jsp
在这里对一些页面变量和对应的java类进行了绑定 --------------------------------------- action state
<action-state id="realSubmit"> <evaluate expression="authenticationViaFormAction.submit(flowRequestContext, flowScope.credentials, messageContext)" /> <transition on="warn" to="warn" /> <transition on="success" to="sendTicketGrantingTicket" /> <transition on="error" to="viewLoginForm" /> </action-state>
执行对应的方法,这儿执行org.jasig.cas.web.flow.AuthenticationViaFormAction中的
submit方法,并根据返回值到不同的分支
这块要弄清楚不容易,建议多看看相关资料,
里面倒腾还是很多的。
|