该配置注册了两个Filter,contentCachingFilter
、loggingFilter
添加了跨域支持addCorsMappings
@Configuration
class WebMvcConfiguration : WebMvcConfigurer {
@Bean
fun contentCachingFilter(): FilterRegistrationBean<Filter> {
return FilterRegistrationBean<Filter>().apply {
filter = ContentCachingFilter()
addUrlPatterns("/")
setName("contentCachingFilter")
order = 1
}
}
@Bean
fun loggingFilter(): FilterRegistrationBean<Filter> {
return FilterRegistrationBean<Filter>().apply {
filter = LoggingFilter()
addUrlPatterns("/")
setName("loggingFilter")
order = 2
}
}
override fun addCorsMappings(registry: CorsRegistry) {
registry.addMapping("/**")
.allowedMethods("POST", "GET", "PUT", "DELETE", "OPTIONS")
.allowedOrigins("*")
.maxAge(3600)
.allowCredentials(true)
}
companion object {
private val logger: Logger = LoggerFactory.getLogger(WebMvcConfiguration::class.java)
}
}
class ContentCachingFilter : Filter {
override fun init(filterConfig: FilterConfig?) {
logger.debug("ContentCachingFilter init")
}
@Throws(IOException::class, ServletException::class)
override fun doFilter(servletRequest: ServletRequest, servletResponse: ServletResponse?, filterChain: FilterChain) {
var requestWrapper: ServletRequest? = null
var responseWrapper: ServletResponse? = null
if (servletRequest is HttpServletRequest) {
if (!servletRequest.getContentType().contains(MediaType.APPLICATION_OCTET_STREAM_VALUE)) {
requestWrapper = ContentCachingRequestWrapper(servletRequest)
}
}
if (servletResponse is HttpServletResponse) {
responseWrapper = ContentCachingResponseWrapper((servletResponse as HttpServletResponse?)!!)
}
filterChain.doFilter(requestWrapper
?: servletRequest, if (responseWrapper == null) servletResponse else servletResponse)
}
override fun destroy() {
logger.debug("ContentCachingFilter destroy")
}
companion object {
private val logger: Logger = LoggerFactory.getLogger(ContentCachingFilter::class.java)
}
}
LoggingFilter使用spring内置的请求过滤器,并且使用slf4j提供的MDC,用来追踪每一次请求
class LoggingFilter : ServletContextRequestLoggingFilter() {
override fun isIncludeHeaders(): Boolean {
return true
}
override fun isIncludeQueryString(): Boolean {
return true
}
override fun isIncludeClientInfo(): Boolean {
return true
}
override fun isIncludePayload(): Boolean {
return true
}
override fun getMaxPayloadLength(): Int {
return Int.MAX_VALUE
}
override fun beforeRequest(request: HttpServletRequest, message: String) {
super.beforeRequest(request, message)
MDC.put("THREAD_ID", UUID.randomUUID().toString().replace("-".toRegex(), ""))
Companion.logger.debug(message)
}
override fun afterRequest(request: HttpServletRequest, message: String) {
super.afterRequest(request, message)
Companion.logger.debug(message)
MDC.clear()
}
@Throws(ServletException::class)
override fun initFilterBean() {
super.initFilterBean()
Companion.logger.debug("LoggingFilter init")
}
override fun destroy() {
super.destroy()
Companion.logger.debug("LoggingFilter destroy")
}
companion object {
private val logger: Logger = LoggerFactory.getLogger(LoggingFilter::class.java)
}
}
网友评论