MvcAutoConfiguration.java 13.1 KB
Newer Older
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
/*
 * Copyright [2020] [MaxKey of copyright http://www.maxkey.top]
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *     http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
 

MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
18
package org.maxkey.autoconfigure;
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
19

20
import java.nio.charset.Charset;
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
21 22
import java.util.ArrayList;
import java.util.List;
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
23 24 25

import javax.servlet.Filter;

M
MaxKey 已提交
26
import org.maxkey.constants.ConstantsTimeInterval;
M
MaxKey 已提交
27 28 29
import org.maxkey.persistence.db.LoginHistoryService;
import org.maxkey.persistence.db.LoginService;
import org.maxkey.web.SessionListenerAdapter;
M
Xss  
MaxKey 已提交
30
import org.maxkey.web.WebXssRequestFilter;
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
31 32
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
33
import org.springframework.beans.factory.InitializingBean;
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
34
import org.springframework.beans.factory.annotation.Value;
M
MaxKey 已提交
35
import org.springframework.boot.actuate.endpoint.http.ActuatorMediaType;
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
36 37 38
import org.springframework.boot.web.server.ConfigurableWebServerFactory;
import org.springframework.boot.web.server.ErrorPage;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
39
import org.springframework.boot.web.servlet.FilterRegistrationBean;
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
40 41
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
M
MaxKey 已提交
42
import org.springframework.context.annotation.DependsOn;
43
import org.springframework.context.annotation.Primary;
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
44
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
45
import org.springframework.http.HttpStatus;
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
46 47
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
48
import org.springframework.http.converter.StringHttpMessageConverter;
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
49 50 51
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.http.converter.xml.MarshallingHttpMessageConverter;
import org.springframework.oxm.jaxb.Jaxb2Marshaller;
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
52
import org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter;
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
53
import org.springframework.web.client.RestTemplate;
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
54
import org.springframework.web.filter.DelegatingFilterProxy;
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
55 56 57 58 59 60 61 62
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
import org.springframework.web.servlet.i18n.CookieLocaleResolver;
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;


@Configuration
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
63
public class MvcAutoConfiguration implements InitializingBean {
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
64
    private static final  Logger _logger = LoggerFactory.getLogger(MvcAutoConfiguration.class);
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
65
   
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
66 67 68 69
    /**
     * cookieLocaleResolver .
     * @return cookieLocaleResolver
     */
70
    @Primary
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
71
    @Bean (name = "localeResolver")
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
72
    public CookieLocaleResolver cookieLocaleResolver(
M
MaxKey 已提交
73
            @Value("${maxkey.server.domain:maxkey.top}")String domainName) {
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
74
        _logger.debug("DomainName " + domainName);
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
75
        CookieLocaleResolver cookieLocaleResolver = new CookieLocaleResolver();
76
        cookieLocaleResolver.setCookieName("maxkey_locale");
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
77
        cookieLocaleResolver.setCookieDomain(domainName);
M
MaxKey 已提交
78
        cookieLocaleResolver.setCookieMaxAge(ConstantsTimeInterval.TWO_WEEK);
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
79 80 81 82 83 84 85 86 87
        return cookieLocaleResolver;
    }
    
    /**
     * 消息处理,可以直接使用properties的key值,返回的是对应的value值
     * messageSource .
     * @return messageSource
     */
    @Bean (name = "messageSource")
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
88 89 90
    public ReloadableResourceBundleMessageSource reloadableResourceBundleMessageSource(
            @Value("${spring.messages.basename:classpath:messages/message}")
            String messagesBasename)  {
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
91
        _logger.debug("Basename " + messagesBasename);
92
        String passwordPolicyMessagesBasename="classpath:messages/passwordpolicy_message";
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
93
        
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
94 95
        ReloadableResourceBundleMessageSource messageSource = 
                new ReloadableResourceBundleMessageSource();
96
        messageSource.setBasenames(messagesBasename,passwordPolicyMessagesBasename);
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
        messageSource.setUseCodeAsDefaultMessage(false);
        return messageSource;
    }
    
    /**
     * Locale Change Interceptor and Resolver definition .
     * @return localeChangeInterceptor
     */
    //@Primary
    @Bean (name = "localeChangeInterceptor")
    public LocaleChangeInterceptor localeChangeInterceptor()  {
        LocaleChangeInterceptor localeChangeInterceptor = 
                new LocaleChangeInterceptor();
        localeChangeInterceptor.setParamName("language");
        return localeChangeInterceptor;
    }
    
    /**
     * upload file support .
     * @return multipartResolver
     */
    @Bean (name = "multipartResolver")
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
119 120
    public CommonsMultipartResolver commonsMultipartResolver(
            @Value("${spring.servlet.multipart.max-file-size:0}") int maxUploadSize)  {
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147
        _logger.debug("maxUploadSize " + maxUploadSize);
        CommonsMultipartResolver multipartResolver = 
                new CommonsMultipartResolver();
        multipartResolver.setMaxUploadSize(maxUploadSize);
        return multipartResolver;
    }
    
    /**
     * handlerMapping .
     * @return handlerMapping
     */
    @Bean (name = "handlerMapping")
    public RequestMappingHandlerMapping requestMappingHandlerMapping(
                                    LocaleChangeInterceptor localeChangeInterceptor) {
        RequestMappingHandlerMapping requestMappingHandlerMapping = 
                new RequestMappingHandlerMapping();
        requestMappingHandlerMapping.setInterceptors(localeChangeInterceptor);
        return requestMappingHandlerMapping;
    }
    
    /**
     * jaxb2Marshaller .
     * @return jaxb2Marshaller
     */
    @Bean (name = "jaxb2Marshaller")
    public Jaxb2Marshaller jaxb2Marshaller() {
        Jaxb2Marshaller jaxb2Marshaller = new Jaxb2Marshaller();
M
MaxKey 已提交
148
        jaxb2Marshaller.setClassesToBeBound(org.maxkey.entity.xml.UserInfoXML.class);;
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164
        return jaxb2Marshaller;
    }
    
    /**
     * marshallingHttpMessageConverter .
     * @return marshallingHttpMessageConverter
     */
    @Bean (name = "marshallingHttpMessageConverter")
    public MarshallingHttpMessageConverter marshallingHttpMessageConverter(
                                                Jaxb2Marshaller jaxb2Marshaller) {
        MarshallingHttpMessageConverter marshallingHttpMessageConverter = 
                new MarshallingHttpMessageConverter();
        marshallingHttpMessageConverter.setMarshaller(jaxb2Marshaller);
        marshallingHttpMessageConverter.setUnmarshaller(jaxb2Marshaller);
        ArrayList<MediaType> mediaTypesList = new ArrayList<MediaType>();
        mediaTypesList.add(MediaType.APPLICATION_XML);
165 166
        mediaTypesList.add(MediaType.TEXT_XML);
        mediaTypesList.add(MediaType.TEXT_PLAIN);
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
167 168 169 170 171 172 173 174 175 176 177 178 179 180
        marshallingHttpMessageConverter.setSupportedMediaTypes(mediaTypesList);
        return marshallingHttpMessageConverter;
    }
    
    /**
     * mappingJacksonHttpMessageConverter .
     * @return mappingJacksonHttpMessageConverter
     */
    @Bean (name = "mappingJacksonHttpMessageConverter")
    public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
        MappingJackson2HttpMessageConverter mappingJacksonHttpMessageConverter = 
                new MappingJackson2HttpMessageConverter();
        ArrayList<MediaType> mediaTypesList = new ArrayList<MediaType>();
        mediaTypesList.add(MediaType.APPLICATION_JSON);
M
MaxKey 已提交
181 182
        mediaTypesList.add(MediaType.valueOf(ActuatorMediaType.V2_JSON));
        mediaTypesList.add(MediaType.valueOf(ActuatorMediaType.V3_JSON));
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
183
        //mediaTypesList.add(MediaType.TEXT_PLAIN);
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
184 185 186 187
        mappingJacksonHttpMessageConverter.setSupportedMediaTypes(mediaTypesList);
        return mappingJacksonHttpMessageConverter;
    }
    
188 189 190 191 192 193 194 195 196 197 198
    /**
     * stringHttpMessageConverter .
     * @return stringHttpMessageConverter
     */
    @Bean (name = "stringHttpMessageConverter")
    public HttpMessageConverter<String> responseBodyConverter() {
        StringHttpMessageConverter stringHttpMessageConverter = new StringHttpMessageConverter(
                Charset.forName("UTF-8"));
        return stringHttpMessageConverter;
    }
    
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
199 200 201 202 203
    /**
     * AnnotationMethodHandlerAdapter
     * requestMappingHandlerAdapter .
     * @return requestMappingHandlerAdapter
     */
M
MaxKey 已提交
204
    @DependsOn("stringHttpMessageConverter")
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
205 206 207
    @Bean (name = "requestMappingHandlerAdapter")
    public RequestMappingHandlerAdapter requestMappingHandlerAdapter(
            MappingJackson2HttpMessageConverter mappingJacksonHttpMessageConverter,
208 209
            MarshallingHttpMessageConverter marshallingHttpMessageConverter,
            StringHttpMessageConverter stringHttpMessageConverter) {
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
210 211 212 213
        List<HttpMessageConverter<?>> httpMessageConverterList = 
                new ArrayList<HttpMessageConverter<?>>();
        httpMessageConverterList.add(mappingJacksonHttpMessageConverter);
        httpMessageConverterList.add(marshallingHttpMessageConverter);
214
        httpMessageConverterList.add(stringHttpMessageConverter);
215 216 217
        
        RequestMappingHandlerAdapter requestMappingHandlerAdapter = 
                new RequestMappingHandlerAdapter();
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237
        requestMappingHandlerAdapter.setMessageConverters(httpMessageConverterList);
        return requestMappingHandlerAdapter;
    }
    
    /**
     * restTemplate .
     * @return restTemplate
     */
    @Bean (name = "restTemplate")
    public RestTemplate restTemplate(
            MappingJackson2HttpMessageConverter mappingJacksonHttpMessageConverter,
            MarshallingHttpMessageConverter marshallingHttpMessageConverter) {
        RestTemplate restTemplate = new RestTemplate();
        List<HttpMessageConverter<?>> httpMessageConverterList = 
                new ArrayList<HttpMessageConverter<?>>();
        httpMessageConverterList.add(mappingJacksonHttpMessageConverter);
        httpMessageConverterList.add(marshallingHttpMessageConverter);
        restTemplate.setMessageConverters(httpMessageConverterList);
        return restTemplate;
    }
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
238

MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260
    /**
     * 配置默认错误页面(仅用于内嵌tomcat启动时) 使用这种方式,在打包为war后不起作用.
     *
     * @return webServerFactoryCustomizer
     */
    @Bean
    public WebServerFactoryCustomizer<ConfigurableWebServerFactory> webServerFactoryCustomizer() {
        return new WebServerFactoryCustomizer<ConfigurableWebServerFactory>() {
            @Override
            public void customize(ConfigurableWebServerFactory factory) {
                _logger.debug("WebServerFactoryCustomizer ... ");
                ErrorPage errorPage400 = 
                        new ErrorPage(HttpStatus.BAD_REQUEST, "/exception/error/400");
                ErrorPage errorPage404 = 
                        new ErrorPage(HttpStatus.NOT_FOUND, "/exception/error/404");
                ErrorPage errorPage500 = 
                        new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR, "/exception/error/500");
                factory.addErrorPages(errorPage400, errorPage404, errorPage500);
            }
        };
    }
    
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
261 262 263 264 265 266
    @Bean
    public SecurityContextHolderAwareRequestFilter securityContextHolderAwareRequestFilter() {
        _logger.debug("securityContextHolderAwareRequestFilter init ");
        return new SecurityContextHolderAwareRequestFilter();
    }
    
M
Xss  
MaxKey 已提交
267 268 269 270 271 272 273 274 275 276 277
    
    @Bean
    public FilterRegistrationBean<Filter> webXssRequestFilter() {
        _logger.debug("delegatingFilterProxy init for /* ");
        FilterRegistrationBean<Filter> registrationBean = new FilterRegistrationBean<Filter>(new WebXssRequestFilter());
        registrationBean.addUrlPatterns("/*");
        registrationBean.setName("webXssRequestFilter");
        registrationBean.setOrder(2);
        return registrationBean;
    }
    
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
278 279 280 281 282 283 284 285 286 287 288 289 290
    @Bean
    public FilterRegistrationBean<Filter> delegatingFilterProxy() {
        _logger.debug("delegatingFilterProxy init for /* ");
        FilterRegistrationBean<Filter> registrationBean = new FilterRegistrationBean<Filter>();
        registrationBean.setFilter(new DelegatingFilterProxy("securityContextHolderAwareRequestFilter"));
        registrationBean.addUrlPatterns("/*");
        //registrationBean.
        registrationBean.setName("delegatingFilterProxy");
        registrationBean.setOrder(1);
        
        return registrationBean;
    }
    
M
MaxKey 已提交
291 292 293 294 295 296 297 298 299 300 301
    @Bean(name = "sessionListenerAdapter")
    public SessionListenerAdapter sessionListenerAdapter(
                LoginService loginService,
                LoginHistoryService loginHistoryService
            ) {
        SessionListenerAdapter sessionListenerAdapter =new SessionListenerAdapter();
        sessionListenerAdapter.setLoginService(loginService);
        sessionListenerAdapter.setLoginHistoryService(loginHistoryService);
        return sessionListenerAdapter;
    }
    
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
302 303 304 305 306
    @Override
    public void afterPropertiesSet() throws Exception {
        // TODO Auto-generated method stub
        
    }
MaxKey单点登录官方's avatar
MaxKey单点登录官方 已提交
307 308 309
    
    
}