Skip to content

Commit c3085f2

Browse files
committed
Merge branch 'release/21.2.1'
2 parents ff23c63 + 91feaf6 commit c3085f2

2 files changed

Lines changed: 136 additions & 0 deletions

File tree

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,11 @@
22

33
We follow the CalVer (https://calver.org/) versioning scheme: YY.MINOR.MICRO.
44

5+
21.2.1 (04-28-2021)
6+
===================
7+
8+
Fix root controller relative redirection
9+
510
21.2.0 (04-28-2021)
611
===================
712

Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
package org.apereo.cas.config;
2+
3+
import org.apereo.cas.configuration.CasConfigurationProperties;
4+
5+
import lombok.val;
6+
7+
import org.apache.commons.lang3.StringUtils;
8+
import org.springframework.beans.factory.ObjectProvider;
9+
import org.springframework.beans.factory.annotation.Autowired;
10+
import org.springframework.beans.factory.annotation.Qualifier;
11+
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
12+
import org.springframework.boot.context.properties.EnableConfigurationProperties;
13+
import org.springframework.cloud.context.config.annotation.RefreshScope;
14+
import org.springframework.context.annotation.Bean;
15+
import org.springframework.context.annotation.Configuration;
16+
import org.springframework.web.servlet.LocaleResolver;
17+
import org.springframework.web.servlet.ModelAndView;
18+
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
19+
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
20+
import org.springframework.web.servlet.handler.SimpleUrlHandlerMapping;
21+
import org.springframework.web.servlet.i18n.CookieLocaleResolver;
22+
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;
23+
import org.springframework.web.servlet.mvc.Controller;
24+
import org.springframework.web.servlet.mvc.ParameterizableViewController;
25+
import org.springframework.web.servlet.mvc.UrlFilenameViewController;
26+
import org.springframework.web.servlet.theme.ThemeChangeInterceptor;
27+
import org.springframework.web.servlet.view.RedirectView;
28+
29+
import javax.servlet.http.HttpServletRequest;
30+
import javax.servlet.http.HttpServletResponse;
31+
32+
import java.util.HashMap;
33+
import java.util.Locale;
34+
import java.util.Optional;
35+
36+
/**
37+
* This is {@link CasWebAppConfiguration}.
38+
*
39+
* @author Misagh Moayyed
40+
* @author Longze Chen
41+
* @since 5.0.0
42+
*/
43+
@Configuration(value = "casWebAppConfiguration", proxyBeanMethods = false)
44+
@EnableConfigurationProperties(CasConfigurationProperties.class)
45+
public class CasWebAppConfiguration implements WebMvcConfigurer {
46+
47+
@Autowired
48+
private CasConfigurationProperties casProperties;
49+
50+
@Autowired
51+
@Qualifier("localeChangeInterceptor")
52+
private ObjectProvider<LocaleChangeInterceptor> localeChangeInterceptor;
53+
54+
@RefreshScope
55+
@Bean
56+
public ThemeChangeInterceptor themeChangeInterceptor() {
57+
val bean = new ThemeChangeInterceptor();
58+
bean.setParamName(casProperties.getTheme().getParamName());
59+
return bean;
60+
}
61+
62+
@ConditionalOnMissingBean(name = "localeResolver")
63+
@Bean
64+
public LocaleResolver localeResolver() {
65+
val localeProps = casProperties.getLocale();
66+
val localeCookie = localeProps.getCookie();
67+
68+
val resolver = new CookieLocaleResolver() {
69+
@Override
70+
protected Locale determineDefaultLocale(final HttpServletRequest request) {
71+
val locale = request.getLocale();
72+
if (StringUtils.isBlank(localeProps.getDefaultValue())
73+
|| !locale.getLanguage().equals(localeProps.getDefaultValue())) {
74+
return locale;
75+
}
76+
return new Locale(localeProps.getDefaultValue());
77+
}
78+
};
79+
resolver.setCookieDomain(localeCookie.getDomain());
80+
resolver.setCookiePath(StringUtils.defaultIfBlank(localeCookie.getPath(), CookieLocaleResolver.DEFAULT_COOKIE_PATH));
81+
resolver.setCookieHttpOnly(localeCookie.isHttpOnly());
82+
resolver.setCookieSecure(localeCookie.isSecure());
83+
resolver.setCookieName(StringUtils.defaultIfBlank(localeCookie.getName(), CookieLocaleResolver.DEFAULT_COOKIE_NAME));
84+
resolver.setCookieMaxAge(localeCookie.getMaxAge());
85+
resolver.setLanguageTagCompliant(true);
86+
resolver.setRejectInvalidCookies(true);
87+
return resolver;
88+
}
89+
90+
@Bean
91+
protected UrlFilenameViewController passThroughController() {
92+
return new UrlFilenameViewController();
93+
}
94+
95+
@Bean
96+
protected Controller rootController() {
97+
return new ParameterizableViewController() {
98+
@Override
99+
protected ModelAndView handleRequestInternal(final HttpServletRequest request,
100+
final HttpServletResponse response) {
101+
val queryString = request.getQueryString();
102+
val url = request.getContextPath() + "/login"
103+
+ Optional.ofNullable(queryString).map(string -> '?' + string).orElse(StringUtils.EMPTY);
104+
// OSF CAS Customization: use absolute URL to temporarily solve the ingress issue on staging1 and prod.
105+
val fullUrl = casProperties.getServer().getName() + url;
106+
return new ModelAndView(new RedirectView(response.encodeURL(fullUrl)));
107+
}
108+
};
109+
}
110+
111+
@Bean
112+
public SimpleUrlHandlerMapping handlerMapping() {
113+
val mapping = new SimpleUrlHandlerMapping();
114+
115+
val root = rootController();
116+
mapping.setOrder(1);
117+
mapping.setAlwaysUseFullPath(true);
118+
mapping.setRootHandler(root);
119+
val urls = new HashMap<String, Object>();
120+
urls.put("/", root);
121+
122+
mapping.setUrlMap(urls);
123+
return mapping;
124+
}
125+
126+
@Override
127+
public void addInterceptors(final InterceptorRegistry registry) {
128+
registry.addInterceptor(localeChangeInterceptor.getObject())
129+
.addPathPatterns("/**");
130+
}
131+
}

0 commit comments

Comments
 (0)