SpringBoot 全局修改返回页面 ViewName(用于版本[主题]控制) 时间: 2021-12-07 16:03 分类: JAVA ####前言 今天心血来潮,又想给网站页面改版了,以前每次改版都是把之前的页面模板给覆盖掉了。 但之前的模板也是辛辛苦苦撸的代码呀,以后可能还想换回去呢? 于是,能否做成多模板的形式呢?答案是肯定可以的。 ####问题分析 至于网站模板的切换,无非就是根据设置返回不同的前端页面。 一般的做法就是每套模板单独放在一个目录下,切换模板的时候,就是将`SpringMvc`返回的`ViewName`改一下就好了。 但是上面有个问题,难道每次想切换网站主题,还得去修改后台的每一个`Controller`中的返回页面值?这样做简直是太不人性了,还得重新编译部署。 于是首先可以想到的就是:后台`Controller`中的返回值不动,我们只需拦截到`ViewName`然后修改掉就行了。 ####开始行动 一开始我想到的是在`ViewResolver`上下手,但是发现无论是重写`resolveViewName`还是`createView`根本不起作用。 ~~那么只能根据调试信息往回找调用者,最终发现还是得从`DispatcherServlet`中下手。~~(好吧,是我想多了,直接使用拦截器`postHandle`中判断修改即可,使用下面的方式多少有点破坏`DispatcherServlet`的默认配置了,如果你非常明确自己`DispatcherServlet`需要哪些功能,可以自定义`DispatcherServlet`来进行精简,但我在使用的时候发现下面的做法会导致文件无法上传,因为下面的代码没用对文件上传进行配置,而`Springboot`默认的`DispatcherServlet`是有配置的) 比如如下需求: 因为一般后台管理页面我们不需要修改,所以对于后台的请求不予修改,新版本网站文件放在`v3`目录,那么只需增加如下代码: ``` @Configuration open class WebConfigurer : WebMvcConfigurer { @Bean open fun dispatcherRegistration(): ServletRegistrationBean? { return ServletRegistrationBean(dispatcherServlet()) } @Bean(name = [DispatcherServletAutoConfiguration.DEFAULT_DISPATCHER_SERVLET_BEAN_NAME]) open fun dispatcherServlet(): DispatcherServlet { return VersionFilter() } } open class VersionFilter: DispatcherServlet() { override fun resolveViewName(viewName: String, model: MutableMap?, locale: Locale, request: HttpServletRequest): View? { return super.resolveViewName(if (viewName.contains("admin")) viewName else "v3/$viewName", model, locale, request) } } ``` 上面只是抛砖引玉,`v3`写死了,如果你想做成后台灵活切换主题的形式,完全可以写入配置自行发挥。 标签: 无