美文网首页架构
spring项目结构设计-Filter打印日志

spring项目结构设计-Filter打印日志

作者: jinelei | 来源:发表于2020-05-13 17:18 被阅读0次

该配置注册了两个Filter,contentCachingFilterloggingFilter
添加了跨域支持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)
    }
}

相关文章

网友评论

    本文标题:spring项目结构设计-Filter打印日志

    本文链接:https://www.haomeiwen.com/subject/svconhtx.html