SpringBoot如何使用项目外部路径图片以及解决CORS跨域问题

发布时间:2021-09-29 17:58:50 作者:柒染
来源:亿速云 阅读:238

SpringBoot如何使用项目外部路径图片以及解决CORS跨域问题

在现代Web应用开发中,图片资源的处理是一个常见的需求。通常情况下,图片资源会存储在项目的静态资源目录中,但随着项目规模的扩大,图片资源的数量也会急剧增加。为了便于管理和维护,开发者往往会选择将图片存储在项目外部的路径中。本文将详细介绍如何在SpringBoot项目中使用外部路径的图片资源,并解决由此可能引发的CORS跨域问题。

1. 使用外部路径图片

1.1 配置外部路径

首先,我们需要在SpringBoot项目中配置外部路径。SpringBoot提供了spring.resources.static-locations配置项,允许我们指定多个静态资源路径。我们可以通过修改application.propertiesapplication.yml文件来配置外部路径。

1.1.1 修改application.properties

spring.resources.static-locations=classpath:/static/,file:/path/to/external/images/

1.1.2 修改application.yml

spring:
  resources:
    static-locations:
      - classpath:/static/
      - file:/path/to/external/images/

在上述配置中,file:/path/to/external/images/表示外部路径,/path/to/external/images/是实际的外部图片存储路径。请根据实际情况修改该路径。

1.2 访问外部路径图片

配置完成后,SpringBoot会自动将外部路径中的图片资源映射到Web应用的静态资源路径中。例如,如果外部路径中有一张图片/path/to/external/images/example.jpg,那么在Web应用中可以通过http://localhost:8080/example.jpg访问该图片。

1.3 动态加载外部路径图片

在某些情况下,我们可能需要动态加载外部路径中的图片。例如,图片路径存储在数据库中,我们需要根据数据库中的路径动态加载图片。此时,我们可以通过编写自定义的Controller来实现。

import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.File;

@RestController
@RequestMapping("/images")
public class ImageController {

    private static final String EXTERNAL_IMAGE_PATH = "/path/to/external/images/";

    @GetMapping(value = "/{imageName}", produces = MediaType.IMAGE_JPEG_VALUE)
    public ResponseEntity<Resource> getImage(@PathVariable String imageName) {
        File imageFile = new File(EXTERNAL_IMAGE_PATH + imageName);
        if (!imageFile.exists()) {
            return ResponseEntity.notFound().build();
        }
        Resource resource = new FileSystemResource(imageFile);
        return ResponseEntity.ok(resource);
    }
}

在上述代码中,我们定义了一个ImageController,通过/images/{imageName}路径可以动态加载外部路径中的图片。EXTERNAL_IMAGE_PATH是外部图片存储路径,imageName是图片文件名。

2. 解决CORS跨域问题

当我们在前端页面中通过Ajax请求加载外部路径图片时,可能会遇到CORS(跨域资源共享)问题。CORS是一种安全机制,用于限制跨域请求。默认情况下,浏览器会阻止跨域请求,除非服务器明确允许。

2.1 什么是CORS

CORS(Cross-Origin Resource Sharing)是一种机制,允许Web应用服务器进行跨域访问控制,从而使跨域数据传输得以安全进行。CORS通过HTTP头来告诉浏览器,哪些跨域请求是被允许的。

2.2 SpringBoot中配置CORS

在SpringBoot中,我们可以通过配置CORS策略来解决跨域问题。SpringBoot提供了多种方式来配置CORS,下面介绍几种常见的方式。

2.2.1 全局CORS配置

我们可以通过实现WebMvcConfigurer接口来全局配置CORS策略。

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class CorsConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("*")
                .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
                .allowedHeaders("*")
                .allowCredentials(true)
                .maxAge(3600);
    }
}

在上述代码中,我们通过addCorsMappings方法配置了全局的CORS策略。allowedOrigins("*")表示允许所有来源的请求,allowedMethods指定了允许的HTTP方法,allowedHeaders指定了允许的请求头,allowCredentials(true)表示允许携带凭证(如Cookies),maxAge(3600)表示预检请求的缓存时间。

2.2.2 局部CORS配置

如果我们只需要在某个Controller或某个方法上启用CORS,可以使用@CrossOrigin注解。

import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api")
public class ApiController {

    @CrossOrigin(origins = "*", allowedHeaders = "*", methods = {RequestMethod.GET, RequestMethod.POST})
    @GetMapping("/data")
    public String getData() {
        return "Hello, CORS!";
    }
}

在上述代码中,我们通过@CrossOrigin注解为getData方法启用了CORS。origins = "*"表示允许所有来源的请求,allowedHeaders = "*"表示允许所有请求头,methods = {RequestMethod.GET, RequestMethod.POST}表示允许的HTTP方法。

2.3 处理图片资源的CORS问题

在前端页面中,如果通过<img>标签加载外部路径图片,通常不会遇到CORS问题。但如果通过Ajax请求加载图片,可能会遇到CORS问题。此时,我们需要确保服务器端正确配置了CORS策略。

例如,假设我们通过Ajax请求加载外部路径图片:

fetch('http://localhost:8080/images/example.jpg')
    .then(response => response.blob())
    .then(blob => {
        const imageUrl = URL.createObjectURL(blob);
        const img = document.createElement('img');
        img.src = imageUrl;
        document.body.appendChild(img);
    })
    .catch(error => console.error('Error:', error));

在上述代码中,我们通过fetch请求加载外部路径图片。如果服务器端没有正确配置CORS策略,浏览器会阻止该请求。

为了确保请求能够成功,我们需要在服务器端配置CORS策略。例如,在ImageController中,我们可以通过@CrossOrigin注解为getImage方法启用CORS。

import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.File;

@RestController
@RequestMapping("/images")
public class ImageController {

    private static final String EXTERNAL_IMAGE_PATH = "/path/to/external/images/";

    @CrossOrigin(origins = "*", allowedHeaders = "*", methods = {RequestMethod.GET})
    @GetMapping(value = "/{imageName}", produces = MediaType.IMAGE_JPEG_VALUE)
    public ResponseEntity<Resource> getImage(@PathVariable String imageName) {
        File imageFile = new File(EXTERNAL_IMAGE_PATH + imageName);
        if (!imageFile.exists()) {
            return ResponseEntity.notFound().build();
        }
        Resource resource = new FileSystemResource(imageFile);
        return ResponseEntity.ok(resource);
    }
}

在上述代码中,我们通过@CrossOrigin注解为getImage方法启用了CORS。origins = "*"表示允许所有来源的请求,allowedHeaders = "*"表示允许所有请求头,methods = {RequestMethod.GET}表示允许的HTTP方法。

2.4 处理预检请求

在某些情况下,浏览器会先发送一个预检请求(OPTIONS请求),以确定服务器是否允许跨域请求。如果服务器没有正确处理预检请求,浏览器会阻止后续的请求。

为了正确处理预检请求,我们需要在服务器端配置允许OPTIONS请求。例如,在CorsConfig中,我们可以通过allowedMethods配置允许OPTIONS请求。

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class CorsConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("*")
                .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
                .allowedHeaders("*")
                .allowCredentials(true)
                .maxAge(3600);
    }
}

在上述代码中,我们通过allowedMethods配置允许OPTIONS请求。这样,当浏览器发送预检请求时,服务器会正确处理并返回允许跨域的响应。

3. 总结

本文详细介绍了如何在SpringBoot项目中使用外部路径的图片资源,并解决由此可能引发的CORS跨域问题。通过配置外部路径和CORS策略,我们可以轻松地在SpringBoot项目中管理和访问外部图片资源,同时确保跨域请求的安全性。

在实际开发中,开发者应根据具体需求选择合适的配置方式,并注意处理预检请求,以确保跨域请求的顺利进行。希望本文能为SpringBoot开发者提供有价值的参考。

推荐阅读:
  1. 如何解决Springboot跨域问题
  2. springboot中怎么解决跨域问题

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

spring boot

上一篇:css中如何使用ul li实现四层级联菜单

下一篇:Asp.net中ajax如何实现任务提示页面

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》