购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.4.3 静态资源访问

在2.4.2节中,如果上传的是图片文件,当处理图片文件的下载请求时,浏览器不会显示此图片,而会下载图片,这是因为当设置HTTP头部的Content-Disposition为attachment时,通常会指示浏览器下载文件。

要使浏览器直接显示图片,可以省略Content-Disposition头部,并确保正确设置文件的Content-Type。例如,对于JPEG图片:

    return ResponseEntity.ok()
       .header(HttpHeaders.CONTENT_TYPE, "image/jpeg")
       .body(resource);

在这个例子中,假设文件是JPEG格式的图片。根据文件实际类型,可能需要动态地设置Content-Type。

除了通过在控制器中指定Content-Type头的方式使浏览器显示图片,还可以通过配置静态资源路径的方式完成。

静态资源是指那些不需要服务器端进行任何处理,直接可以被Web客户端(如浏览器)读取和显示的文件。这些资源主要包括但不限于:

前端代码文件:HTML、CSS、JavaScript文件。

图片:如JPEG、PNG、GIF等格式的图像文件。

字体文件:如WOFF、TTF等。

其他媒体文件:如音频和视频文件。

与服务器端动态生成的内容(如动态HTML或JSON)相比,静态资源有以下几个特点。

效率高:静态资源不需要服务器进行计算或处理,直接从磁盘或其他存储介质读取并发送到客户端。

客户端缓存:静态资源适合客户端缓存,因为它们不像动态内容那样频繁更改。这有助于提高性能并减少服务器负载。

CDN分发:静态资源可以通过内容分发网络(CDN)分发,以加速内容加载并提高用户体验。

可以通过在Spring Boot应用中配置静态资源路径,使这些资源直接可被Web客户端访问。这通常通过在application.properties文件或类似配置文件中设置静态资源目录来实现。

1.通过配置文件实现

通过在application.properties文件中设置spring.resources.static-locations属性来指定静态资源的路径,例如:

    spring.resources.static-locations=classpath:/custom-path/,
    classpath:/another-path/

在这个示例中,custom-path和another-path是类路径上的资源目录。也可以使用file:前缀指向文件系统上的绝对路径。例如,在这些目录下有一个名为image.jpg的文件,可以通过如下URL访问它:

    http://yourserver:port/image.jpg
2.通过配置类实现

创建一个配置类,实现WebMvcConfigurer接口,WebMvcConfigurer是Spring Web MVC框架的一部分,提供了一种回调方法来自定义Spring MVC的默认配置。通过覆盖addResourceHandlers()方法以自定义资源处理器,实现静态资源路径的设置。

在demo项目的根包(com.example.demo)下创建config包,并在此包下新建名为WebConfig的类,代码如下。

    @Configuration
    public class WebConfig implements WebMvcConfigurer {
        @Override
        public void addResourceHandlers(ResourceHandlerRegistry registry) {
            registry.addResourceHandler("/resources/**")
                    .addResourceLocations("classpath:/custom-path/")
                    .setCachePeriod(3600)
                    .resourceChain(true)
                    .addResolver(new PathResourceResolver());
        }
    }

这段代码定义了一个Spring的配置类WebConfig,该类实现了WebMvcConfigurer接口以自定义Spring MVC的默认配置。这里,它覆盖了addResourceHandlers方法以配置静态资源的处理,代码实现的主要逻辑如下。

@Configuration是一个Spring注解,用于标记该类为Spring配置类。

addResourceHandlers是WebMvcConfigurer接口中的方法,允许我们自定义资源处理,在方法中调用了registry.addResourceHandler("/resources/**"),指定了一个URI模式(/resources/**),表示这个模式的所有请求都应该被视为静态资源请求。例如,请求/resources/images/pic.jpg会尝试在配置的资源位置查找pic.jpg。

.addResourceLocations("classpath:/custom-path/")告诉Spring在哪里查找这些静态资源。在这里,它是指在类路径下的custom-path目录。所以,如果你有一个名为pic.jpg的资源在src/main/resources/custom-path/images/下,那么它可以通过/resources/images/pic.jpg来访问。

.setCachePeriod(3600)设置了资源的缓存时间(以秒为单位)。这里设置为3600秒,即1小时。这意味着浏览器会缓存这些资源1小时,除非有更改。

.resourceChain(true)启用了资源链,资源链可以增强资源的处理,如通过缓存或编码。

.addResolver(new PathResourceResolver())添加了一个资源解析器。PathResourceResolver是默认的解析器,它基于URI解析静态资源。如果需要,还可以添加其他解析器或自定义解析器。

总的来说,这段代码配置了Spring MVC处理/resources/**路径下的静态资源请求,并指定了这些资源在类路径的custom-path目录下。同时,它为这些资源设置了1小时的缓存,并启用了资源链进行资源的处理。

3.默认静态资源目录

在Spring Boot应用中,如果不进行任何自定义配置,框架默认会搜索以下类路径下的目录并将它们作为静态资源目录。

/META-INF/resources/。

/resources/。

/static/。

/public/。

将静态文件(如HTML、CSS、JS或图片)放置在这些目录下,Spring Boot会自动提供这些文件的访问。

需要注意的是,直接将上传的文件保存到静态资源目录并公开访问,可能存在安全风险,包括未经授权的文件上传、路径遍历攻击和资源滥用等。通过控制器方式提供文件访问,可以将文件保存在非静态资源目录,从而更好地控制文件访问,并实施额外的安全策略。

在实际项目中,可以考虑以下策略来增强文件存储的安全性。

使用数据库存储文件:将文件作为BLOB类型存储在数据库中。这种方式更安全,但可能增加数据库的复杂性和存储需求。

使用专用的文件存储服务:如Amazon S3或阿里云对象存储等云服务。这些服务提供高可用性、可扩展性、文件版本控制、备份和加密功能,以及细粒度的访问控制,但可能产生额外费用。

无论选择哪种方法存储文件,都需要确保以下内容。

对上传的文件进行安全检查(如文件类型、大小等)。

使用随机和不可预测的文件名来保存上传的文件。

定期备份存储的文件。

实施适当的错误处理和异常处理机制。 DG1Kwn9O3LUjhz9jAWLrIOm7i9y3PG8Bj8jflXlQPcTjrPBNUZ3bDSD1PImx3qxc

点击中间区域
呼出菜单
上一章
目录
下一章
×