首页 资讯 社群 我的社区 搜索

关于WebMvcConfigurer接口中的addResourceHandlers方法

高大上
2019-08-10 20:40:01

关于springMVC感觉我已经总结过很多次了,但是每次回过头来看时都能发现一些新的东西!

最近在看spring源码,其中有一段是讲springMVC是如何超越其他产品最终一统江湖的,有兴趣的可以去看看它的发展史!

我们今天主要看看WebMvcConfigurer接口。该接口下共有10多个方法,但是我目前用到过的只有5个,其他应该不怎么常用。

package com.vesystem.file_serves.common.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.*;

import javax.annotation.Resource;

/**
 * @Author: hcy
 * @Date: 2019/7/29 10:48
 */
@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Resource
    private ResourceInterceptor resourceInterceptor;

    //拦截器配置
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(resourceInterceptor).addPathPatterns("/**")
                .excludePathPatterns("/login.html"
               
                );

    }
    //默认静态资源处理器
    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {

    }
    //静态资源处理
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/download/**")//GlobalConfigParam.PERSONROOT
                .addResourceLocations("file:"+GlobalConfigParam.PERSONROOT);///download/**

        /*//swagger资源地址
        registry.addResourceHandler("swagger-ui.html")
                .addResourceLocations("classpath:/META-INF/resources/");
        registry.addResourceHandler("/webjars/**").
                addResourceLocations("classpath:/META-INF/resources/webjars/");
        registry.addResourceHandler("/appico/**")
                .addResourceLocations("classpath:/appico/");
        registry.addResourceHandler("/userIco/**")
                .addResourceLocations("classpath:/userIco/");*/
    }
    //视图跳转控制器
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {

    }
    //这里配置视图解析器
    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {

    }
    //配置跨源请求处理
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**").allowedMethods("POST","GET","DELETE","PUT","OPTIONS");
    }

}

 

我们今天主要讲的是addResourceHandlers,配置静态资源
public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/download/**")
                .addResourceLocations("file:"+GlobalConfigParam.PERSONROOT);///D:/hcy/demo/

    }
我们结合一个场景分析下它的实际意义。我最近有这样一个需求:上级用户可以通过FTP将部分文件上传到服务器上的指定文件夹(例如D:/hcy/demo/下),
如果其他用户想要下载这些文件,我们以前的做法是将文件复制到tomcat/项目/resource下。也就是我们常写的“classpath/**”。
其实我们可已通过addResourceHandlers将项目的resource目录直接指定到任何一个存在的目录下。
例如这里,我的可以通过浏览器访问:http://127.0.0.1:8082/download/aa.docx 就能直接下载到服务器上D:/hcy/demo/aa.docx 这个文件。
file: 是windows规定的文件协议头,不加这个是无法下载文件的,但是图片等资源可以被浏览器直接引用。
(file: 是windows规定的文件协议头,这个是我自己的为了方便记忆的理解)
通过这种方式我们可以将任何资源添加到项目中,而不用复制文件。同时,资源路径是可以添加多个的,当通过url访问时任何一个资源文件能匹配到url就会返回~

最后介绍一个ieda的技巧,当我们看源码时idea会将class文件反编译,但是里面并没有注释。点击上面的download sources。idea会下载这个文件的项目的源码,
基本maven库里面的能拉到源码,有注释看起来就爽多了

用户评论