国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

基于spring gateway 的靜態(tài)資源緩存實(shí)現(xiàn)

這篇具有很好參考價(jià)值的文章主要介紹了基于spring gateway 的靜態(tài)資源緩存實(shí)現(xiàn)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

由于子項(xiàng)目比較多,子項(xiàng)目都是通過(guò)嵌套的方式實(shí)現(xiàn)的。就會(huì)導(dǎo)致子頁(yè)面加載比較慢,影響客戶體驗(yàn)

實(shí)現(xiàn)思路(AI搜的--!):

1、通過(guò)spring boot緩存實(shí)現(xiàn)靜態(tài)資源緩存

2、在gateway過(guò)濾器,對(duì)靜態(tài)資源進(jìn)行緩存

直接上代碼:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-774737.html

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-cache</artifactId>
</dependency>
package com.xxx.filter;

import lombok.extern.slf4j.Slf4j;
import org.springframework.cache.Cache;
import org.springframework.cache.CacheManager;
import org.springframework.cache.support.SimpleValueWrapper;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.reactive.function.client.WebClient;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

import java.net.URI;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author Wang
 * 創(chuàng)建時(shí)間: 2023/11/15 10:19
 * 功能描述:靜態(tài)資源緩存
 */
@Slf4j
@Component
public class StaticResourceFilter implements GlobalFilter, Ordered {


    private static final String STATIC_RESOURCE_PATTERN = "\\.(html|css|js|png|jpg|jpeg|gif|woff2|woff)$";
    private final WebClient webClient;
    private final CacheManager cacheManager;
    List<String> synchronizedList = Collections.synchronizedList(new ArrayList<>());

    public StaticResourceFilter(WebClient webClient, CacheManager cacheManager) {
        this.webClient = webClient;
        this.cacheManager = cacheManager;
    }

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        ServerHttpRequest request = exchange.getRequest();
        URI uriInfo = request.getURI();
        String staticResourcePath = getUrl(uriInfo);
        if (isStaticResource(staticResourcePath) && !synchronizedList.contains(staticResourcePath)) {
            //Route route = exchange.getAttribute(ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR);
            String cacheKey = request.getURI().toString();
            Cache cache = cacheManager.getCache("staticResources");

            // 嘗試從緩存中獲取靜態(tài)資源
            Object cachedResource = cache.get(cacheKey);
            if (cachedResource != null) {
                if (cachedResource instanceof SimpleValueWrapper) {
                    cachedResource = ((SimpleValueWrapper) cachedResource).get();
                }

                // 如果緩存中存在,直接返回緩存的資源
                ServerHttpResponse response = exchange.getResponse();
                HttpHeaders headers = response.getHeaders();

                String fileSuffix = staticResourcePath.replaceAll(".*(\\.[a-zA-Z0-9]+)$", "$1");
                // 根據(jù)文件后綴設(shè)置MIME類型
                switch (fileSuffix) {
                    case ".html":
                        headers.setContentType(MediaType.TEXT_HTML);
                        break;
                    case ".js":
                        headers.set(HttpHeaders.CONTENT_TYPE, "application/javascript");
                        break;
                    case ".css":
                        headers.set(HttpHeaders.CONTENT_TYPE, "text/css");
                        break;
                    case ".png":
                        headers.setContentType(MediaType.IMAGE_PNG);
                        break;
                    case ".jpg":
                    case ".jpeg":
                        headers.setContentType(MediaType.IMAGE_JPEG);
                        break;
                    case ".woff":
                        headers.set(HttpHeaders.CONTENT_TYPE, "application/font-woff");
                        break;
                    case ".woff2":
                        headers.set(HttpHeaders.CONTENT_TYPE, "application/font-woff2");
                        break;
                    case ".ttf":
                        headers.set(HttpHeaders.CONTENT_TYPE, "application/x-font-ttf");
                        break;
                    case ".eot":
                        headers.set(HttpHeaders.CONTENT_TYPE, "application/vnd.ms-fontobject");
                        break;
                    default:
                        headers.setContentType(MediaType.ALL);
                        break;
                }

                // 這里假設(shè)緩存的內(nèi)容是字節(jié)數(shù)組,您可以根據(jù)實(shí)際情況進(jìn)行調(diào)整
                DataBuffer dataBuffer = response.bufferFactory().wrap((byte[]) cachedResource);
                return response.writeWith(Mono.just(dataBuffer));
            }
            // 如果緩存不存在,則繼續(xù)請(qǐng)求下游服務(wù)獲取資源,并將其緩存起來(lái)
            return chain.filter(exchange).then(Mono.fromRunnable(() -> {
                getResourceFromDownstream(staticResourcePath, cacheKey, cache);
            }));
        }

        // 繼續(xù)處理其他過(guò)濾器或請(qǐng)求
        return chain.filter(exchange);
    }

    @Override
    public int getOrder() {
        return Ordered.HIGHEST_PRECEDENCE;
    }

    /**
     * 根據(jù)請(qǐng)求路徑判斷是否為靜態(tài)資源請(qǐng)求
     *
     * @param staticResourcePath 請(qǐng)求路徑
     */
    private boolean isStaticResource(String staticResourcePath) {
        Pattern pattern = Pattern.compile(STATIC_RESOURCE_PATTERN);
        Matcher matcher = pattern.matcher(staticResourcePath);
        return matcher.find();
    }

    /**
     * 請(qǐng)求下游服務(wù)靜態(tài)資源的方法,這里只是一個(gè)示例,您需要根據(jù)實(shí)際情況實(shí)現(xiàn)此方法
     *
     * @param cache              緩存
     * @param staticResourcePath URL
     * @param cacheKey           緩存Key
     */
    private void getResourceFromDownstream(String staticResourcePath, String cacheKey, Cache cache) {

        synchronizedList.add(staticResourcePath);
        Mono<byte[]> mono = webClient.get().uri(staticResourcePath).retrieve().bodyToMono(byte[].class);
        // 處理響應(yīng)數(shù)據(jù)
        mono.subscribe(res -> {
            synchronizedList.remove(staticResourcePath);
            cache.put(cacheKey, res);
        }, error -> {
            log.error("請(qǐng)求下游服務(wù)靜態(tài)資源失?。簕},\n錯(cuò)誤詳情:{}", staticResourcePath, error.toString());
        });
    }

    /**
     * 獲取靜態(tài)資源地址
     *
     * @param uri uri
     * @return 靜態(tài)資源地址
     */
    private String getUrl(URI uri) {
        String path = uri.getPath();
        String host = uri.getHost();
        int port = uri.getPort();

        // 下游服務(wù)的地址是
        String downstreamUrl = String.format("http://%s:%s%s", host, port, path);
        return downstreamUrl;
    }
}

到了這里,關(guān)于基于spring gateway 的靜態(tài)資源緩存實(shí)現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 第七章 : Spring cloud 網(wǎng)關(guān)中心 Gateway (靜態(tài)路由)

    第七章 : Spring cloud 網(wǎng)關(guān)中心 Gateway (靜態(tài)路由) 前言 本章知識(shí)點(diǎn):本章將會(huì)介紹什么是Spring Cloud Gateway、為什么會(huì)出現(xiàn)Spring Cloud Gateway,以及Spring Cloud Gateway的工作原理和實(shí)戰(zhàn)用法,以及Spring Cloud Gateway 路由概念以及基于nacos注冊(cè)中心Spring Cloud Gateway 靜態(tài)路由的實(shí)戰(zhàn)。 什么

    2024年02月02日
    瀏覽(38)
  • Spring Boot靜態(tài)資源映射

    在 Web 應(yīng)用中會(huì)涉及到大量的靜態(tài)資源,例如 JS、CSS 和 HTML 等。我們知道,Spring MVC 導(dǎo)入靜態(tài)資源文件時(shí),需要配置靜態(tài)資源的映射;但在 SpringBoot 中則不再需要進(jìn)行此項(xiàng)配置,因?yàn)?SpringBoot 已經(jīng)默認(rèn)完成了這一工作。 Spring Boot 默認(rèn)為我們提供了 3 種靜態(tài)資源映射規(guī)則: We

    2023年04月24日
    瀏覽(18)
  • 38、springboot為 spring mvc 提供的靜態(tài)資源管理,覆蓋和添加靜態(tài)資源目錄

    38、springboot為 spring mvc 提供的靜態(tài)資源管理,覆蓋和添加靜態(tài)資源目錄

    ▲ 默認(rèn)的四個(gè)靜態(tài)資源目錄: /META-INF/resources /resources /static /public ▲ ResourceProperties.java類的源代碼,可看到CLASSPATH_RESOURCE_LOCATIONS常量的定義: CLASSPATH_RESOURCE_LOCATIONS = new String[]{“classpath:/META-INF/resources/”, “classpath:/resources/”, “classpath:/static/”, “classpath:/public/”}; 這意味

    2024年02月11日
    瀏覽(24)
  • Spring Boot 配置靜態(tài)資源路徑

    在Spring Boot 2.7.2版本中,查看默認(rèn)靜態(tài)資源路徑,在 WebProperties.class 中如下 可以看到默認(rèn)資源路徑有4個(gè)。 使用 Spring Initializr 新建Spring Boot項(xiàng)目,自帶 static 目錄,直接將前端資源文件放到該目錄下,啟動(dòng)項(xiàng)目,訪問(wèn) http://localhost:端口號(hào)/資源目錄/名稱.html 即可; 例如,有一個(gè)

    2023年04月15日
    瀏覽(18)
  • Spring Boot 訪問(wèn)靜態(tài)資源css/js

    Spring Boot 訪問(wèn)靜態(tài)資源css/js

    我們用 Spring Boot 搭建 Web 應(yīng)用時(shí)(如搭建一個(gè)博客),經(jīng)常需要在 Html 中訪問(wèn)一些靜態(tài)資源,比如: css 樣式; js 腳本; favicon.ico 圖標(biāo)等; 而在 Spring Boot 中如果沒(méi)有做任何配置,是無(wú)法直接訪問(wèn)靜態(tài)資源的,通常會(huì)報(bào) 404 錯(cuò)誤 Spring Boot 訪問(wèn)靜態(tài)資源,默認(rèn)有兩個(gè)默認(rèn)目錄:

    2024年02月08日
    瀏覽(27)
  • Spring Data Redis + RabbitMQ - 基于 string 實(shí)現(xiàn)緩存、計(jì)數(shù)功能(同步數(shù)據(jù))

    Spring Data Redis + RabbitMQ - 基于 string 實(shí)現(xiàn)緩存、計(jì)數(shù)功能(同步數(shù)據(jù))

    目錄 一、Spring Data Redis 1.1、緩存功能 1.1.1、分析 1.1.2、案例實(shí)現(xiàn) 1.1.3、效果演示 1.2、計(jì)數(shù)功能(Redis + RabbitMQ) 1.2.1、分析 1.2.2、案例實(shí)現(xiàn) 1.1.1、分析 使用 redis 作為緩存, MySQL 作為數(shù)據(jù)庫(kù)組成的架構(gòu) 整體思路: 應(yīng)用服務(wù)器訪問(wèn)數(shù)據(jù)的時(shí)候,先查詢 Redis,如果 Redis 上存在該

    2024年02月05日
    瀏覽(22)
  • Spring Data Redis + RabbitMQ - 基于 string + hash 實(shí)現(xiàn)緩存,計(jì)數(shù)(高內(nèi)聚)

    Spring Data Redis + RabbitMQ - 基于 string + hash 實(shí)現(xiàn)緩存,計(jì)數(shù)(高內(nèi)聚)

    目錄 一、Spring Data Redis 1.1、緩存功能(分析) 1.2、案例實(shí)現(xiàn) hash 類型存儲(chǔ)緩存相比于 string 類型就有更多的更合適的使用場(chǎng)景. 例如,我有以下這樣一個(gè) UserInfo 信息? 假設(shè)這樣一個(gè)場(chǎng)景就是:

    2024年02月05日
    瀏覽(20)
  • Spring boot之WEB 開(kāi)發(fā)-靜態(tài)資源訪問(wèn)--自定義轉(zhuǎn)換器--處理JSON--內(nèi)容協(xié)商

    Spring boot之WEB 開(kāi)發(fā)-靜態(tài)資源訪問(wèn)--自定義轉(zhuǎn)換器--處理JSON--內(nèi)容協(xié)商

    在線文檔: https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.developing-web-applications 1. 只要靜態(tài)資源放在類路徑下: /static 、/public 、/resources 、/META-INF/resources可以被直接訪問(wèn)- 對(duì)應(yīng)文件WebProperties.java 2. 常見(jiàn)靜態(tài)資源:JS、CSS 、圖片(.jpg .png .gif .bmp .svg)、字體

    2024年02月09日
    瀏覽(37)
  • Minio + Nginx 實(shí)現(xiàn)靜態(tài)資源對(duì)外訪問(wèn)

    ? ? ? ? 公司交付項(xiàng)目,文件服務(wù)java + minio實(shí)現(xiàn)文件基本功能。其中包含文件上傳與下載與在線預(yù)覽,由于文件下載功能實(shí)現(xiàn)方式問(wèn)題(web直接調(diào)用文件預(yù)覽接口,有minio直接返回可預(yù)覽路徑二次請(qǐng)求實(shí)現(xiàn)文件下載)。 ? ? ? ? 在公司局域網(wǎng)內(nèi)沒(méi)有問(wèn)題,到客戶環(huán)境文件無(wú)法

    2024年02月08日
    瀏覽(37)
  • Spring MVC學(xué)習(xí)隨筆-控制器(Controller)開(kāi)發(fā)詳解:控制器跳轉(zhuǎn)與作用域(二)視圖模板、靜態(tài)資源訪問(wèn)

    Spring MVC學(xué)習(xí)隨筆-控制器(Controller)開(kāi)發(fā)詳解:控制器跳轉(zhuǎn)與作用域(二)視圖模板、靜態(tài)資源訪問(wèn)

    學(xué)習(xí)視頻:孫哥說(shuō)SpringMVC:結(jié)合Thymeleaf,重塑你的MVC世界!|前所未有的Web開(kāi)發(fā)探索之旅 銜接上文Spring MVC學(xué)習(xí)隨筆-控制器(Controller)開(kāi)發(fā)詳解:控制器跳轉(zhuǎn)與作用域(一) SpingMVC中request作用域的處理 代碼 Model、ModelMap相關(guān)細(xì)節(jié)分析 通過(guò)Model、ModelMap進(jìn)行作用域處理,可以解決

    2024年02月05日
    瀏覽(34)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包