ResourceHandlerRegistry的addResourceLocations方法设置linux路径,访问项目外图片,亲测可行

场景:部署的Springboot项目,打成jar包,需要通过url直接访问jar外部路径的资源,本人的Springboot为2.1.11.RELEASE。

一、配置WebMvcConfigurer,设置url访问静态资源映射

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    /**
     * 日志记录器
     */
    private static final Logger logger = LoggerFactory.getLogger(WebMvcConfig.class);

    @Value("${image.baseImagePath}")
    private String baseImagePath;

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        //        addResourceHandler是指你想在url请求的路径
        // addResourceLocations是图片存放的真实路
        registry.addResourceHandler("/image/**")
                .addResourceLocations("file:" + baseImagePath)

          // 可以自定义资源处理类,对加载后的资源进行二次处理,比如图片统一打标识、解密之类的      
        //.resourceChain(true).addTransformer(new SecretImageResourceTransformerSupport())
        ;

    }
}

二、添加application.yml,再配置中配置访问的真是路径

###############################    图片真实存储位置  #############################
image:
  baseImagePath: ./image_base64

三、服务器的部署路径创建 image_base64文件夹,和jar同级目录,里面存放需要访问的图片

例如存放了12345.jpg图片

四、启动项目,访问的 ip:端口/项目基本路径/image/12345.jpg即可查看图片,也可以支持路径嵌套,在image_base64文件夹中在创建子目录,访问的时候加上即可。

例子:本人在application.yml中配置

server:
  port: 8089
  servlet:
    context-path: /test

图片访问路径:localhost:8089/test/image/12345.jpg

 

==========================如果需要对取出的资源加特殊处理======================================

1、将 .resourceChain(true).addTransformer(new SecretImageResourceTransformerSupport())加上

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    /**
     * 日志记录器
     */
    private static final Logger logger = LoggerFactory.getLogger(WebMvcConfig.class);

    @Value("${image.baseImagePath}")
    private String baseImagePath;

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        //        addResourceHandler是指你想在url请求的路径
        // addResourceLocations是图片存放的真实路
        registry.addResourceHandler("/image/**")
                .addResourceLocations("file:" + baseImagePath)

          // 可以自定义资源处理类,对加载后的资源进行二次处理,比如图片统一打标识、解密之类的      
        .resourceChain(true).addTransformer(new SecretImageResourceTransformerSupport())
        ;

    }
}

2、定义自己的图片资源处理类 SecretImageResourceTransformerSupport,继承ResourceTransformerSupport,具体操作步骤可以参考Spring源码的CssLinkResourceTransformer

public class SecretImageResourceTransformerSupport extends ResourceTransformerSupport {

    private static String SUPPORT_IMG = "jpg";

    /** 日志记录器 */
    private static final Logger logger = LoggerFactory.getLogger(SecretImageResourceTransformerSupport.class);
    
    @Override
    public Resource transform(HttpServletRequest httpServletRequest, Resource resource, ResourceTransformerChain resourceTransformerChain) throws IOException {
        resource = resourceTransformerChain.transform(httpServletRequest, resource);

        String filename = resource.getFilename();
        if (!SUPPORT_IMG.equals(StringUtils.getFilenameExtension(filename))) {
            return resource;
        }

        byte[] bytes = FileCopyUtils.copyToByteArray(resource.getInputStream());
        // 本人做的的图片解密,你也可以根据自己需要将bytes 做其他处理
        // bytes = DESUtil.decryptDES(bytes, DESUtil.DES_KEY);

        resource = new TransformedResource(resource, bytes);

        return resource;
    }
}

3、启动服务重新访问地址栏,就可以查看自己对图片资源处理的结果。本人的代码里限制了只处理jpg格式,自己看情况而定。

 

原创不易,如果对你有用记得点赞哦,就是对我创作好文章的最大鼓励!!!

谢谢老板!!!

Spring Boot中设置拦截器时,需要注意一些细节。 首先,如果你的静态资源图片不显示,可能是因为拦截器配置不当导致的。在配置拦截器时,可以使用`addPathPatterns()`方法设置需要拦截的路径,同时也需要使用`excludePathPatterns()`方法排除不需要拦截的路径。如果没有正确地配置排除路径,就可能会导致静态资源无法访问。 另,还需要在配置文件中设置静态资源路径。在Spring Boot中,默认情况下静态资源路径为`/static`、`/public`、`/resources`和`/META-INF/resources`。如果你的静态资源存储在其他路径下,需要在配置文件中进行设置。 以下是一个示例拦截器配置,可以参考一下: ```java @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new UserInterceptor()) .addPathPatterns("/user/**") .excludePathPatterns("/user/login", "/user/register"); registry.addInterceptor(new AdminInterceptor()) .addPathPatterns("/admin/**") .excludePathPatterns("/admin/login"); } @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/static/**") .addResourceLocations("classpath:/static/"); } } ``` 在上面的示例中,`UserInterceptor`和`AdminInterceptor`分别是自定义的拦截器类。`addPathPatterns()`方法设置需要拦截的路径,`excludePathPatterns()`方法排除不需要拦截的路径。`addResourceHandlers()`方法设置静态资源路径为`/static/**`,存储在`classpath:/static/`下。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值