Spring Boot 自定义Spring MVC 配置: WebMvcConfigurationSupport

简介: Spring Boot 自定义Spring MVC 配置: WebMvcConfigurationSupportpackage com.easy.springboot.

Spring Boot 自定义Spring MVC 配置: WebMvcConfigurationSupport

package com.easy.springboot.demo_spring_mvc.mvc_config

import com.alibaba.fastjson.serializer.SerializerFeature
import com.alibaba.fastjson.support.config.FastJsonConfig
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter
import com.easy.springboot.demo_spring_mvc.handler.LoginSessionHandlerInterceptor
import freemarker.template.Configuration
import freemarker.template.TemplateException
import org.slf4j.LoggerFactory
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.context.annotation.Bean
import org.springframework.core.env.Environment
import org.springframework.format.FormatterRegistry
import org.springframework.format.datetime.DateFormatter
import org.springframework.http.converter.HttpMessageConverter
import org.springframework.web.servlet.config.annotation.*
import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer
import org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver
import java.io.IOException


@org.springframework.context.annotation.Configuration
class WebMvcConfig : WebMvcConfigurationSupport() {
    val log = LoggerFactory.getLogger(WebMvcConfig::class.java)
    @Autowired lateinit var loginSessionHandlerInterceptor: LoginSessionHandlerInterceptor
    @Autowired lateinit var environment: Environment

    /**
     * 拦截器配置
     */
    override fun addInterceptors(registry: InterceptorRegistry) {
        super.addInterceptors(registry)
        //注册自定义拦截器,添加拦截路径和排除拦截路径
        registry.addInterceptor(loginSessionHandlerInterceptor).
                addPathPatterns("/**").
                excludePathPatterns(
                        "/index",
                        "/login",
                        "/doLogin",
                        "/logout",
                        "/register",
                        "/doRegister",
                        "/**/*.js",
                        "/**/*.css",
                        "/**/*.css.map",
                        "/**/*.jpeg",
                        "/**/*.ico",
                        "/**/*.jpg",
                        "/**/*.png",
                        "/**/*.woff",
                        "/**/*.woff2"
                )

    }

    /**
     * 静态资源路径映射
     */
    override fun addResourceHandlers(registry: ResourceHandlerRegistry) {
        super.addResourceHandlers(registry)
        registry.addResourceHandler("/app/**").addResourceLocations("classpath:/static/app/")
        registry.addResourceHandler("/bower_components/**").addResourceLocations("classpath:/static/bower_components/")

    }


//    @GetMapping(value = ["/index"])
//    fun index(): String {
//        return "index"
//    }
//
//    @GetMapping(value = ["/about"])
//    fun about(): String {
//        return "about"
//    }
//
//    @GetMapping(value = ["/error/403"])
//    fun error_403(): String {
//        return "error/403"
//    }
//
//    @GetMapping(value = ["/error/500"])
//    fun error_500(): String {
//        return "error/500"
//    }
    /**
     * View - Controller 映射配置
     */
    override fun addViewControllers(registry: ViewControllerRegistry) {
        super.addViewControllers(registry)

        registry.addViewController("/").setViewName("/index")
        registry.addViewController("/index").setViewName("/index")
        registry.addViewController("/about").setViewName("/about")
        registry.addViewController("/error/403").setViewName("/error/403")
        registry.addViewController("/error/500").setViewName("/error/500")
    }

    /**
     * 重写 addCorsMappings方法:
    addMapping:配置可以被跨域的路径,可以任意配置,可以具体到直接请求路径。
    allowedMethods:允许所有的请求方法访问该跨域资源服务器,如:POST、GET、PUT、DELETE等。
    allowedOrigins:允许所有的请求域名访问我们的跨域资源,可以固定单条或者多条内容,如:"http://www.baidu.com",只有百度可以访问我们的跨域资源。
    allowedHeaders:允许所有的请求header访问,可以自定义设置任意请求头信息,如:"X-TOKEN"
     */
    override fun addCorsMappings(registry: CorsRegistry) {
        super.addCorsMappings(registry)
        registry.addMapping("/**")
                .allowedOrigins("*")
                .allowedMethods("*")
                .allowedHeaders("*")


    }


    /**
     *
     * FreeMarker视图配置
     * 配置了@Bean注解,该注解会将方法返回值加入到Spring Ioc 容器内。
     * @return
     */
    @Bean
    fun freeMarkerViewResolver(): FreeMarkerViewResolver {
        val viewResolver = FreeMarkerViewResolver()
        // freemarker本身配置了templateLoaderPath而在viewResolver中不需要配置prefix,且路径前缀必须配置在 templateLoaderPath 中
        viewResolver.setPrefix("")
        viewResolver.setSuffix(".ftl")
        viewResolver.isCache = false
        viewResolver.setContentType("text/html;charset=UTF-8")
        viewResolver.setRequestContextAttribute("requestContext") //为模板调用时,调用 request 对象的变量名
        viewResolver.order = 0
        viewResolver.setExposeRequestAttributes(true);
        viewResolver.setExposeSessionAttributes(true);
        return viewResolver
    }


    /**
    spring.freemarker.suffix=.ftl
    spring.freemarker.templateEncoding=UTF-8
    spring.freemarker.templateLoaderPath=classpath:/templates/

     * 1.spring和freemarker的整合,需要定义两个bean:FreeMarkerViewResolver、FreeMarkerConfigurer。
     * 2.spring在Dispatcher中定义了视图渲染的过程:创建视图,然后利用Freemarker本身提供的Template方法来处理。
     */
    @Bean
    fun freemarkerConfig(): FreeMarkerConfigurer {
        val freemarkerConfig = FreeMarkerConfigurer()
        freemarkerConfig.setDefaultEncoding("UTF-8")
        freemarkerConfig.setTemplateLoaderPath("classpath:/templates/")
        var configuration: Configuration? = null
        try {
            configuration = freemarkerConfig.createConfiguration()
            configuration.defaultEncoding = "UTF-8"
        } catch (e: IOException) {
            log.error("freemarker配置bean,IO异常: {}", e)
        } catch (e: TemplateException) {
            log.error("freemarker配置bean,TemplateException 异常: {}", e)
        }

        val freemarkerVars = mutableMapOf<String, Any>()
        freemarkerVars["rootContextPath"] = environment.getProperty("root.context.path")
        freemarkerConfig.setFreemarkerVariables(freemarkerVars)
        return freemarkerConfig
    }

    /**
     * 配置视图解析器:ViewResolver
     * ########################################################
    ###FREEMARKER (FreeMarkerAutoConfiguration)
    ########################################################
    spring.freemarker.allow-request-override=false
    spring.freemarker.cache=true
    spring.freemarker.check-template-location=true
    spring.freemarker.charset=UTF-8
    spring.freemarker.content-type=text/html
    spring.freemarker.expose-request-attributes=false
    spring.freemarker.expose-session-attributes=false
    spring.freemarker.expose-spring-macro-helpers=false
    #spring.freemarker.prefix=
    #spring.freemarker.request-context-attribute=
    #spring.freemarker.settings.*=
    spring.freemarker.suffix=.ftl
    spring.freemarker.template-loader-path=classpath:/templates/
    #comma-separated list
    #spring.freemarker.view-names= # whitelist of view names that can be resolved
     */
    override fun configureViewResolvers(registry: ViewResolverRegistry) {
        super.configureViewResolvers(registry)
        registry.viewResolver(freeMarkerViewResolver())
    }

    /**
     * 配置消息转换器
     */
    override fun configureMessageConverters(converters: MutableList<HttpMessageConverter<*>>) {
        super.configureMessageConverters(converters)
        //创建fastjson消息转换器: FastJsonHttpMessageConverter
        val fastConverter = FastJsonHttpMessageConverter()
        //创建 FastJsonConfig 配置类
        val fastJsonConfig = FastJsonConfig()
        //定制过滤 JSON 返回
        fastJsonConfig.setSerializerFeatures(
                SerializerFeature.WriteNullNumberAsZero,
                SerializerFeature.DisableCircularReferenceDetect,
                SerializerFeature.WriteMapNullValue,
                SerializerFeature.WriteNullStringAsEmpty
        )
        fastConverter.setFastJsonConfig(fastJsonConfig)
        //将 fastConverter 添加到视图消息转换器列表内
        converters.add(fastConverter)

    }

    override fun addFormatters(registry: FormatterRegistry) {
        super.addFormatters(registry)
        registry.addFormatter(DateFormatter("yyyy-MM-dd"))
    }


}
AI 代码解读
目录
打赏
0
0
0
0
78
分享
相关文章
SpringBoot入门 - 对Hello world进行MVC分层
SpringBoot入门 - 对Hello world进行MVC分层
85 3
SpringBoot入门 - 对Hello world进行MVC分层
SpringBoot入门(3) - 对Hello world进行MVC分层
SpringBoot入门(3) - 对Hello world进行MVC分层
58 4
对Spring、SpringMVC、MyBatis框架的介绍与解释
Spring 框架提供了全面的基础设施支持,Spring MVC 专注于 Web 层的开发,而 MyBatis 则是一个高效的持久层框架。这三个框架结合使用,可以显著提升 Java 企业级应用的开发效率和质量。通过理解它们的核心特性和使用方法,开发者可以更好地构建和维护复杂的应用程序。
147 29
Spring Boot 两种部署到服务器的方式
本文介绍了Spring Boot项目的两种部署方式:jar包和war包。Jar包方式使用内置Tomcat,只需配置JDK 1.8及以上环境,通过`nohup java -jar`命令后台运行,并开放服务器端口即可访问。War包则需将项目打包后放入外部Tomcat的webapps目录,修改启动类继承`SpringBootServletInitializer`并调整pom.xml中的打包类型为war,最后启动Tomcat访问应用。两者各有优劣,jar包更简单便捷,而war包适合传统部署场景。需要注意的是,war包部署时,内置Tomcat的端口配置不会生效。
626 17
Spring Boot 两种部署到服务器的方式
🛡️Spring Boot 3 整合 Spring Cloud Gateway 工程实践
本文介绍了如何使用Spring Cloud Alibaba 2023.0.0.0技术栈构建微服务网关,以应对微服务架构中流量治理与安全管控的复杂性。通过一个包含鉴权服务、文件服务和主服务的项目,详细讲解了网关的整合与功能开发。首先,通过统一路由配置,将所有请求集中到网关进行管理;其次,实现了限流防刷功能,防止恶意刷接口;最后,添加了登录鉴权机制,确保用户身份验证。整个过程结合Nacos注册中心,确保服务注册与配置管理的高效性。通过这些实践,帮助开发者更好地理解和应用微服务网关。
85 0
🛡️Spring Boot 3 整合 Spring Cloud Gateway 工程实践
SpringBoot是如何简化Spring开发的,以及SpringBoot的特性以及源码分析
Spring Boot 通过简化配置、自动配置和嵌入式服务器等特性,大大简化了 Spring 应用的开发过程。它通过提供一系列 `starter` 依赖和开箱即用的默认配置,使开发者能够更专注于业务逻辑而非繁琐的配置。Spring Boot 的自动配置机制和强大的 Actuator 功能进一步提升了开发效率和应用的可维护性。通过对其源码的分析,可以更深入地理解其内部工作机制,从而更好地利用其特性进行开发。
62 6
Spring Boot 3 集成 Spring Security + JWT
本文详细介绍了如何使用Spring Boot 3和Spring Security集成JWT,实现前后端分离的安全认证概述了从入门到引入数据库,再到使用JWT的完整流程。列举了项目中用到的关键依赖,如MyBatis-Plus、Hutool等。简要提及了系统配置表、部门表、字典表等表结构。使用Hutool-jwt工具类进行JWT校验。配置忽略路径、禁用CSRF、添加JWT校验过滤器等。实现登录接口,返回token等信息。
798 12
Spring Boot 3 集成Spring AOP实现系统日志记录
本文介绍了如何在Spring Boot 3中集成Spring AOP实现系统日志记录功能。通过定义`SysLog`注解和配置相应的AOP切面,可以在方法执行前后自动记录日志信息,包括操作的开始时间、结束时间、请求参数、返回结果、异常信息等,并将这些信息保存到数据库中。此外,还使用了`ThreadLocal`变量来存储每个线程独立的日志数据,确保线程安全。文中还展示了项目实战中的部分代码片段,以及基于Spring Boot 3 + Vue 3构建的快速开发框架的简介与内置功能列表。此框架结合了当前主流技术栈,提供了用户管理、权限控制、接口文档自动生成等多项实用特性。
115 8
步步深入SpringMvc DispatcherServlet源码掌握springmvc全流程原理
通过对 `DispatcherServlet`源码的深入剖析,我们了解了SpringMVC请求处理的全流程。`DispatcherServlet`作为前端控制器,负责请求的接收和分发,处理器映射和适配负责将请求分派到具体的处理器方法,视图解析器负责生成和渲染视图。理解这些核心组件及其交互原理,有助于开发者更好地使用和扩展SpringMVC框架。
77 4
SpringBoot入门(3) - 对Hello world进行MVC分层
SpringBoot入门(3) - 对Hello world进行MVC分层
39 1
 SpringBoot入门(3) - 对Hello world进行MVC分层
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等