这是由于CAS本身的一个Bug引起的 。
分析:
定时器 org.jasig.cas.ticket.registry.support.DefaultTicketRegistryCleaner
核心代码如下:
final List<Ticket> ticketsToRemove = new ArrayList<Ticket>();
final Collection<Ticket> ticketsInCache;
ticketsInCache = this.ticketRegistry.getTickets();
System.out.println("hello ! size:"+ticketsInCache.size() );
for (final Ticket ticket : ticketsInCache) {
System.out.println(ticket.isExpired());
if (ticket.isExpired()) {
ticketsToRemove.add(ticket);
}
}
所以 登入校验判断的时候 也要 从 this.ticketRegistry.getTickets() 里面获取。
<on-start>
<evaluate expression="initialFlowSetupAction" />
</on-start>
<decision-state id="ticketGrantingTicketExistsCheck">
<if test="flowScope.ticketGrantingTicketId != null" then="hasServiceCheck"
else="gatewayRequestCheck" />
</decision-state>
<decision-state id="hasServiceCheck">
<if test="flowScope.service != null" then="renewRequestCheck" else="viewGenericLoginSuccess" />
</decision-state>
在 org.jasig.cas.web.flow.InitialFlowSetupAction的方法中 ticketGrantingTicketId 是从cookiet中获取的,应改为从ticketRegistry中获取。
context.getFlowScope().put("ticketGrantingTicketId", ticketRegistry.getTicket(this.ticketGrantingTicketCookieGenerator.retrieveCookieValue(request)));
context.getFlowScope().put("warnCookieValue",Boolean.valueOf(this.
在 cas-servlet.xml 中,修改配置 如下:
<bean id="initialFlowSetupAction" class="org.jasig.cas.web.flow.InitialFlowSetupAction"
p:argumentExtractors-ref="argumentExtractors"
p:warnCookieGenerator-ref="warnCookieGenerator"
p:ticketRegistry-ref="ticketRegistry"
p:ticketGrantingTicketCookieGenerator-ref="ticketGrantingTicketCookieGenerator" />