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"))
    }


}
相关文章
|
22天前
|
Java API 数据库
Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐
本文通过在线图书管理系统案例,详细介绍如何使用Spring Boot构建RESTful API。从项目基础环境搭建、实体类与数据访问层定义,到业务逻辑实现和控制器编写,逐步展示了Spring Boot的简洁配置和强大功能。最后,通过Postman测试API,并介绍了如何添加安全性和异常处理,确保API的稳定性和安全性。
32 0
|
15天前
|
Java API Spring
在 Spring 配置文件中配置 Filter 的步骤
【10月更文挑战第21天】在 Spring 配置文件中配置 Filter 是实现请求过滤的重要手段。通过合理的配置,可以灵活地对请求进行处理,满足各种应用需求。还可以根据具体的项目要求和实际情况,进一步深入研究和优化 Filter 的配置,以提高应用的性能和安全性。
|
7天前
|
Java Spring
[Spring]aop的配置与使用
本文介绍了AOP(面向切面编程)的基本概念和核心思想。AOP是Spring框架的核心功能之一,通过动态代理在不修改原代码的情况下注入新功能。文章详细解释了连接点、切入点、通知、切面等关键概念,并列举了前置通知、后置通知、最终通知、异常通知和环绕通知五种通知类型。
18 1
|
23天前
|
Java BI 调度
Java Spring的定时任务的配置和使用
遵循上述步骤,你就可以在Spring应用中轻松地配置和使用定时任务,满足各种定时处理需求。
110 1
|
前端开发 Java 应用服务中间件
Spring Boot与Spring MVC集成启动过程源码分析
背后spring-boot到底做了什么使我们的工作如此简单,它如何将spring、spring-mvc、tomcat整合到一起的呢?接下来我们以项目启动角度来分析整个初始化过程。
2882 0
|
27天前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,包括版本兼容性、安全性、性能调优等方面。
132 1
|
11天前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。首先,创建并配置 Spring Boot 项目,实现后端 API;然后,使用 Ant Design Pro Vue 创建前端项目,配置动态路由和菜单。通过具体案例,展示了如何快速搭建高效、易维护的项目框架。
92 62
|
9天前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,帮助开发者提高开发效率和应用的可维护性。
24 2
|
12天前
|
JavaScript Java 项目管理
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。
|
2月前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的大学竞赛报名管理系统
基于Java+Springboot+Vue开发的大学竞赛报名管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的大学竞赛报名管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
209 3
基于Java+Springboot+Vue开发的大学竞赛报名管理系统
下一篇
无影云桌面