Apereo CAS Web Application Themes Support - Provides comprehensive theme resolution and management capabilities for the Central Authentication Service
—
Chain-based theme resolution system that evaluates multiple resolution strategies in priority order to determine the appropriate theme for each request.
Theme resolver that chains multiple resolvers and returns the first non-default result.
/**
* Theme resolver that chains multiple resolvers using chain of responsibility pattern
*/
public class ChainingThemeResolver extends AbstractThemeResolver {
/**
* Default constructor creating empty resolver chain
*/
public ChainingThemeResolver();
/**
* Adds resolver to the chain for evaluation
* @param r Theme resolver to add to the chain
* @return This ChainingThemeResolver for method chaining
*/
@CanIgnoreReturnValue
public ChainingThemeResolver addResolver(ThemeResolver r);
/**
* Resolves theme name by trying each resolver in chain order
* @param httpServletRequest HTTP request to resolve theme for
* @return Theme name from first resolver returning non-default result, or default theme
*/
@Override
public String resolveThemeName(@Nonnull HttpServletRequest httpServletRequest);
/**
* No-op implementation for theme setting - theme is resolved, not set
* @param httpServletRequest HTTP request
* @param httpServletResponse HTTP response
* @param s Theme name
*/
@Override
public void setThemeName(@Nonnull HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse, String s);
}Usage Examples:
import org.apereo.cas.services.web.ChainingThemeResolver;
import org.springframework.web.servlet.theme.CookieThemeResolver;
import org.springframework.web.servlet.theme.SessionThemeResolver;
import org.springframework.web.servlet.theme.FixedThemeResolver;
// Create chaining resolver
ChainingThemeResolver chainResolver = new ChainingThemeResolver();
chainResolver.setDefaultThemeName("default");
// Add resolvers in priority order
CookieThemeResolver cookieResolver = new CookieThemeResolver();
cookieResolver.setDefaultThemeName("default");
chainResolver.addResolver(cookieResolver);
SessionThemeResolver sessionResolver = new SessionThemeResolver();
sessionResolver.setDefaultThemeName("default");
chainResolver.addResolver(sessionResolver);
FixedThemeResolver fixedResolver = new FixedThemeResolver();
fixedResolver.setDefaultThemeName("default");
chainResolver.addResolver(fixedResolver);
// Resolve theme for request
String themeName = chainResolver.resolveThemeName(request);The ChainingThemeResolver evaluates resolvers in the order they were added:
// Example evaluation flow:
// 1. CookieThemeResolver returns "default" -> continue
// 2. SessionThemeResolver returns "dark" -> return "dark"
// 3. Remaining resolvers are not evaluatedA typical CAS theme resolution chain includes:
// Standard chain configuration (as done by auto-configuration)
chainResolver
.addResolver(cookieThemeResolver) // Priority 1
.addResolver(sessionThemeResolver) // Priority 2
.addResolver(headerThemeResolver) // Priority 3
.addResolver(serviceThemeResolver) // Priority 4
.addResolver(fixedThemeResolver); // Priority 5 (fallback)defaultThemeNameTheme resolution occurs within the context of:
The chaining resolver provides robust error handling:
// Example custom resolver
public class DatabaseThemeResolver extends AbstractThemeResolver {
@Override
public String resolveThemeName(HttpServletRequest request) {
String userId = getUserIdFromRequest(request);
return userThemeService.getThemeForUser(userId);
}
@Override
public void setThemeName(HttpServletRequest request,
HttpServletResponse response, String themeName) {
// Implement theme persistence if needed
}
}
// Add to chain
DatabaseThemeResolver dbResolver = new DatabaseThemeResolver();
dbResolver.setDefaultThemeName("default");
chainResolver.addResolver(dbResolver);Install with Tessl CLI
npx tessl i tessl/maven-org-apereo-cas--cas-server-support-themes