1,修改org.jasig.cas.web.flow.InitialFlowSetupAction.java将pathPopulated属性改为public
2,在web.xm中添加
<servlet-mapping> <servlet-name>cas</servlet-name> <url-pattern>/noflow</url-pattern> </servlet-mapping>
3,在cas-servlet.xml中添加
<bean id="noflowLoginController" class="org.jasig.cas.web.my.noflowlogin.noFlowLoginAction" p:argumentExtractors-ref="argumentExtractors" p:warnCookieGenerator-ref="warnCookieGenerator" p:centralAuthenticationService-ref="centralAuthenticationService" p:ticketGrantingTicketCookieGenerator-ref="ticketGrantingTicketCookieGenerator" p:initialFlowSetupAction-ref="initialFlowSetupAction" ></bean>
修改bean,黑体为新增
<bean id="handlerMappingC" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings"> <props> <prop key="/logout"> logoutController </prop> <prop key="/serviceValidate"> serviceValidateController </prop> <prop key="/validate"> legacyValidateController </prop> <prop key="noflow"> noflowLoginController </prop> <prop key="/proxy"> proxyController </prop> <prop key="/proxyValidate"> proxyValidateController </prop> <prop key="/samlValidate"> samlValidateController </prop> <prop key="/services/add.html"> addRegisteredServiceSimpleFormController </prop> <prop key="/services/edit.html"> editRegisteredServiceSimpleFormController </prop> <prop key="/services/loggedOut.html"> serviceLogoutViewController </prop> <prop key="/services/viewStatistics.html"> viewStatisticsController </prop> <prop key="/services/*">manageRegisteredServicesMultiActionController</prop> <prop key="/openid/*">openIdProviderController</prop> <prop key="/authorizationFailure.html">passThroughController</prop> <prop key="/403.html">passThroughController</prop> </props> </property> <property name="alwaysUseFullPath" value="true" /> <!-- uncomment this to enable sending PageRequest events. <property name="interceptors"> <list> <ref bean="pageRequestHandlerInterceptorAdapter" /> </list> </property> --> </bean>
4,noFlowLoginAction类的具体内容为:
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.NotNull;
import org.hibernate.validator.constraints.NotEmpty;
import org.jasig.cas.CentralAuthenticationService;
import org.jasig.cas.authentication.principal.Credentials;
import org.jasig.cas.authentication.principal.Service;
import org.jasig.cas.authentication.principal.UsernamePasswordCredentials;
import org.jasig.cas.ticket.TicketException;
import org.jasig.cas.web.flow.InitialFlowSetupAction;
import org.jasig.cas.web.support.ArgumentExtractor;
import org.jasig.cas.web.support.CookieRetrievingCookieGenerator;
import org.jasig.cas.web.support.WebUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;
import org.springframework.web.servlet.view.RedirectView;
public class noFlowLoginAction extends AbstractController {
@NotNull
private CentralAuthenticationService centralAuthenticationService;
@NotNull
private CookieRetrievingCookieGenerator warnCookieGenerator;
@NotNull
private CookieRetrievingCookieGenerator ticketGrantingTicketCookieGenerator;
private InitialFlowSetupAction initialFlowSetupAction;
/** Extractors for finding the service. */
@NotEmpty
private List<ArgumentExtractor> argumentExtractors;
protected ModelAndView handleRequestInternal(HttpServletRequest request,
HttpServletResponse response) throws Exception {
String uName = request.getParameter("username");
String password = request.getParameter("password");
Credentials credentials =new UsernamePasswordCredentials(uName,password);
if (!this.initialFlowSetupAction.pathPopulated) {
final String contextPath = request.getContextPath();
final String cookiePath = StringUtils.hasText(contextPath) ? contextPath + "/" : "/";
logger.info("Setting path for cookies to: "
+ cookiePath);
this.warnCookieGenerator.setCookiePath(cookiePath);
this.ticketGrantingTicketCookieGenerator.setCookiePath(cookiePath);
this.initialFlowSetupAction.pathPopulated = true;
}
final Service service = WebUtils.getService( this.argumentExtractors, request);
String ticketGrantingTicketId="";
String serviceTicket = "";
try {
ticketGrantingTicketId = this.centralAuthenticationService.createTicketGrantingTicket(credentials);
/***
* 产生新的票据,并将票据及服务记录在缓存中
*/
serviceTicket= this.centralAuthenticationService.grantServiceTicket(ticketGrantingTicketId,service);
this.ticketGrantingTicketCookieGenerator.removeCookie(response);
this.ticketGrantingTicketCookieGenerator.addCookie(request, response, ticketGrantingTicketId);
this.warnCookieGenerator.addCookie(request, response, "true");
} catch (TicketException e) {
e.printStackTrace();
}
return new ModelAndView(new RedirectView(request.getParameter("service")+"?ticket="+serviceTicket));
}
public void setWarnCookieGenerator(final CookieRetrievingCookieGenerator warnCookieGenerator) {
this.warnCookieGenerator = warnCookieGenerator;
}
public void setArgumentExtractors(
final List<ArgumentExtractor> argumentExtractors) {
this.argumentExtractors = argumentExtractors;
}
public final void setCentralAuthenticationService(final CentralAuthenticationService centralAuthenticationService) {
this.centralAuthenticationService = centralAuthenticationService;
}
public void setTicketGrantingTicketCookieGenerator(
final CookieRetrievingCookieGenerator ticketGrantingTicketCookieGenerator) {
this.ticketGrantingTicketCookieGenerator = ticketGrantingTicketCookieGenerator;
}
public void setInitialFlowSetupAction(
InitialFlowSetupAction initialFlowSetupAction) {
this.initialFlowSetupAction = initialFlowSetupAction;
}
}
5,使用方法是:
<form action="http://localhost:8081/casserver/noflow" method="post">
<table>
<input type="hidden" id="targetService" name="service" value="http://localhost:8081/casclient4/sso/index.jsp">
<input type="hidden" name="failpae" value="http://localhost:8081/casclient4/index.jsp">
<table>
<tr>
<td>用户名:</td>
<td><input type="text" name="username"></td>
</tr>
<tr>
<td>密 码:</td>
<td><input type="password" name="password"></td>
</tr>
<tr><td>验证码</td>
<td><input type="text" /><img
src="http://localhost:8081/casserver/random"
class="sign_img fl mt5" /></td></tr>
<tr>
<td colspan="2"><input type="submit" value="登陆" /></td>
</tr>
</table>
</table>
</form>
6,你可以自己测试了