用于在 Servlet 3.0+ 容器中注册Servlet的ServletContextInitializer 。 类似于ServletContext提供的registration功能,但具有 Spring Bean 友好设计。
必须在调用onStartup之前指定servlet 。 URL 映射可以使用setUrlMappings配置或在映射到 ‘/*’ 时省略(除非alwaysMapUrl设置为false )。 如果未指定,将推断出 servlet 名称。
因为:
1.4.0
请参见:
ServletContextInitializer , ServletContext.addServlet(String, Servlet)
类型参数:
- 要注册的Servlet的类型
package com.abc.config;
import static com.alibaba.fastjson.serializer.SerializerFeature.DisableCircularReferenceDetect;
import static com.alibaba.fastjson.serializer.SerializerFeature.QuoteFieldNames;
import static com.alibaba.fastjson.serializer.SerializerFeature.WriteMapNullValue;
import static com.alibaba.fastjson.serializer.SerializerFeature.WriteNullListAsEmpty;
import static com.alibaba.fastjson.serializer.SerializerFeature.WriteNullNumberAsZero;
import static com.alibaba.fastjson.serializer.SerializerFeature.WriteNullStringAsEmpty;
import java.util.List;
import javax.servlet.MultipartConfigElement;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
import org.springframework.web.servlet.DispatcherServlet;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
// 序列化配置
FastJsonConfig config = new FastJsonConfig();
config.setSerializerFeatures(QuoteFieldNames, // 输出key时是否使用双引号
WriteMapNullValue, // 是否输出值为null的字段
WriteNullNumberAsZero, // 数值字段如果为null,输出为0,而非null
WriteNullListAsEmpty, // List字段如果为null,输出为[],而非null
WriteNullStringAsEmpty, // 字符类型字段如果为null,输出为"",而非null
// WriteNullBooleanAsFalse,//Boolean字段如果为null,输出为false,而非null
// WriteNullStringAsEmpty,// null String不输出
// WriteMapNullValue,//null String也要输出
// WriteDateUseDateFormat,//Date的日期转换器
DisableCircularReferenceDetect// 禁止循环引用
);
converter.setFastJsonConfig(config);
converters.add(converter);
}
// 解决跨域
@Bean
public CorsFilter corsFilter() {
CorsConfiguration conf = new CorsConfiguration();
conf.addAllowedHeader("*");
conf.addAllowedMethod("*");
conf.addAllowedOrigin("*");
conf.setAllowCredentials(true);
conf.setMaxAge(3600L);
conf.addExposedHeader("set-cookie");
conf.addExposedHeader("access-control-allow-headers");
conf.addExposedHeader("access-control-allow-methods");
conf.addExposedHeader("access-control-allow-origin");
conf.addExposedHeader("access-control-max-age");
conf.addExposedHeader("X-Frame-Options");
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", conf); // 4 对接口配置跨域设置
return new CorsFilter(source);
}
@Autowired
private MultipartConfigElement multipartConfigElement;
@Autowired
private DispatcherServlet dispatcherServlet;
@Bean
public ServletRegistrationBean<DispatcherServlet> apiServlet() {
ServletRegistrationBean<DispatcherServlet> bean = new ServletRegistrationBean<DispatcherServlet>(
dispatcherServlet);
// 注入上传配置到自己注册的ServletRegistrationBean
bean.addUrlMappings("/api/v1/*");
bean.setMultipartConfig(multipartConfigElement);
bean.setName("apiServlet");
return bean;
}
// //区分api与静态资源。后端服务通过restful接口交互,静态资源通过/根目录的方式访问
// @Bean
// public ServletRegistrationBean<DispatcherServlet> apiV1ServletBean(WebApplicationContext wac) {
// DispatcherServlet servlet = new DispatcherServlet(wac);
// ServletRegistrationBean<DispatcherServlet> bean = new ServletRegistrationBean<DispatcherServlet>(servlet, "/api/v1/*");
// bean.setMultipartConfig(multipartConfigElement);
// bean.setName("api-v1");
// return bean;
// }
// @Bean
// public ServletRegistrationBean<DispatcherServlet> restServlet(){
// //注解扫描上下文
// AnnotationConfigWebApplicationContext applicationContext
// = new AnnotationConfigWebApplicationContext();
// //base package
// applicationContext.scan("com.abc.controller","com.abc.mbp.controller");
// //通过构造函数指定dispatcherServlet的上下文
// DispatcherServlet rest_dispatcherServlet
// = new DispatcherServlet(applicationContext);
//
// //用ServletRegistrationBean包装servlet
// ServletRegistrationBean<DispatcherServlet> registrationBean
// = new ServletRegistrationBean<DispatcherServlet>(rest_dispatcherServlet);
// registrationBean.setLoadOnStartup(1);
// //指定urlmapping
// registrationBean.addUrlMappings("/api/v1/*");
// //指定name,如果不指定默认为dispatcherServlet
// registrationBean.setName("api-v1");
// return registrationBean;
// }
//
// shiro 静态资源不拦截
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**").addResourceLocations("classpath:/ui/");
}
}