成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

SpringBoot中的攔截器江湖

開發 前端
很多小伙伴在工作中遇到攔截需求就無腦寫HandlerInterceptor,結果被復雜場景搞得鼻青臉腫。作為一名有多年開發經驗的程序員,今天領大家到SpringBoot的山頭認認6把交椅。

前言

很多小伙伴在工作中遇到攔截需求就無腦寫HandlerInterceptor,結果被復雜場景搞得鼻青臉腫。

作為一名有多年開發經驗的程序員,今天領大家到SpringBoot的山頭認認6把交椅:

圖片圖片

這篇文章以梁山為背景的介紹SpringBoot中的攔截器,可能更通俗易懂。

希望對你會有所幫助,記得點贊和收藏。

第一把交椅:Filter

Filter是梁山中的總寨主。

典型戰斗場面:全局鑒權/接口耗時統計

@WebFilter("/*") 
public class CostFilter implements Filter {
    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) {
        long start = System.currentTimeMillis();
        chain.doFilter(req, res); // 放行江湖令箭
        System.out.println("接口耗時:"+(System.currentTimeMillis()-start)+"ms");
    }
}

起義緣由:必須是最高寨主,因為他在Servlet容器滾刀肉層面出手。想當年有個兄弟在Filter里調用Spring Bean,結果NPE錯殺千人(要用WebApplicationContextUtils拿Bean才是正解)

第二把交椅:HandlerInterceptor

HandlerInterceptor是梁山中的二當家。

必殺場景:接口權限驗證/請求參數自動裝填

public class AuthInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        String token = request.getHeader("X-Token");
        if(!"vip666".equals(token)){
            response.setStatus(403);
            returnfalse; // 關門放狗
        }
        returntrue;
    }
}

// 衙門張貼告示
@Configuration
publicclass WebMvcConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new AuthInterceptor())
                .addPathPatterns("/api/**")
                .excludePathPatterns("/api/login");
    }
}

二當家的雷區

  1. postHandle里修改了Response但內容已提交(注意response.isCommitted()判斷)
  2. 攔截資源請求要配置靜態路徑排出(例如/exclude/**)
  3. 多攔截器順序要調準確(Order值越小越早執行)

第三把交椅:AOP攔截器

AOP是梁山中的軍師智多星。

運籌帷幄場景:服務層方法緩存/事務管理

@Aspect
@Component
public class CacheAspect {
    @Around("@annotation(com.example.anno.Cacheable)")
    public Object aroundCache(ProceedingJoinPoint jp) {
        String cacheKey = buildKey(jp);
        Object cacheVal = redisTemplate.opsForValue().get(cacheKey);
        if(cacheVal != null) return cacheVal;
        
        Object result = jp.proceed();
        redisTemplate.opsForValue().set(cacheKey, result, 5, TimeUnit.MINUTES);
        return result;
    }
}

軍師錦囊

  • 只可攔截Spring管理的Bean(new的對象攔截不了)
  • 與Transactional注解的順序要注意(建議AOP切面Order大于事務切面)
  • 自定義注解要寫在接口方法上才生效(要是實現類方法需要用@within)

第四把交椅:RestTemplate攔截器

RestTemplate是梁山中的水軍頭領。

遠程戰事:統一添加請求頭/加密請求參數

public class TraceInterceptor implements ClientHttpRequestInterceptor {
    @Override
    public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) {
        request.getHeaders().add("X-TraceId", UUID.randomUUID().toString());
        return execution.execute(request, body);
    }
}

// 注冊水軍
@Bean
public RestTemplate restTemplate() {
    RestTemplate rt = new RestTemplate();
    rt.getInterceptors().add(new TraceInterceptor());
    return rt;
}

總督黑歷史

  1. 編碼問題:body若是字符串需要自行轉字節數組(避免亂碼)
  2. 多次攔截:攔截器按添加順序執行(第一個最后執行)
  3. 訪問HTTPS需要額外配置SSL(記得補上SSLContext)

第五把交椅:Feign攔截器

Feign攔截器是梁山中的外交使節。

出使外國:統一簽名計算/Header透傳

public class FeignAuthInterceptor implements RequestInterceptor {
    @Override
    public void apply(RequestTemplate template) {
        template.header("Authorization", "Bearer " + SecurityContext.getToken());
    }
}

// 締結合約
@Configuration
publicclass FeignConfig {
    @Bean
    public FeignAuthInterceptor feignAuthInterceptor() {
        returnnew FeignAuthInterceptor();
    }
}

使節燙手山芋

  • GET請求Body丟失問題(要自己特殊處理)
  • Form表單參數要手動編碼(使用feign-form擴展)
  • Path參數需要Expression表達式解析(動態值要用@Param注明)

第六把交椅:WebFilter

WebFilter是梁山中的特種兵。

閃電戰場景:響應式編程統一編碼/跨域處理

@Component
public class CorsWebFilter implements WebFilter {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
        ServerHttpResponse response = exchange.getResponse();
        response.getHeaders().add("Access-Control-Allow-Origin", "*");
        return chain.filter(exchange);
    }
}

作戰條件

  • 必須在WebFlux環境下(傳統MVC無效)
  • 響應式編程模式(函數式聲明)
  • 非阻塞管道(異步要配合Mono/Flux)

各派武功排行榜

門派

攻擊范圍

招式復雜度

內力消耗

首選戰場

Filter

全局最外層

★★☆☆☆

安全校驗/日志記錄

Handler

MVC控制器層

★★★☆☆

權限控制

AOP

業務方法級

★★★★☆

緩存/事務

RestTemplate

HTTP客戶端

★★★☆☆

服務間調用

Feign

聲明式客戶端

★★★★☆

微服務通信

WebFilter

響應式全鏈路

★★★★★

極高

WebFlux應用

武林秘笈

1. 順序就是力量

Filter -> Interceptor -> AOP ,越早攔截越省力(但別在Filter里做業務)

2. 量力而行選兵器

  • 簡單鑒權用HandlerInterceptor
  • 方法級管控上AOP
  • 微服務用FeignInterceptor

3. 性能損耗要監控

用Arthas監控攔截鏈路耗時,避免攔截器連環奪命call

# 查看HandlerInterceptor耗時
trace *.preHandle '#cost>10'
 
# 診斷AOP切面
watch com.example.aop.*Aspect * '{params,returnObj}' -x 3

最后送給各位江湖兒女一句話:

攔截是門藝術,別讓好刀砍了自己人!

責任編輯:武曉燕 來源: 蘇三說技術
相關推薦

2020-03-25 17:55:30

SpringBoot攔截器Java

2023-09-05 08:58:07

2025-01-02 10:10:51

2009-06-24 16:00:00

2023-09-15 11:26:16

2009-09-27 17:37:32

Hibernate攔截

2025-02-28 08:14:53

2024-05-06 00:00:00

C#工具代碼

2011-05-16 10:14:11

Hibernate

2009-07-08 17:02:11

JDK實現調用攔截器

2011-11-21 14:21:26

SpringMVCJava框架

2021-07-19 05:48:30

springboot 攔截器項目

2024-05-13 09:32:06

攔截器HTTP中間件

2009-06-25 15:54:42

Struts2教程攔截器

2009-06-25 15:59:21

Struts2教程攔截器

2021-11-03 17:04:11

攔截器操作Servlet

2012-02-03 13:27:16

2009-02-04 14:19:38

2009-06-04 08:01:25

Struts2攔截器原理

2009-02-04 14:45:06

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 中文字幕日韩三级 | 久久久一区二区三区四区 | 成人激情视频免费在线观看 | 超级乱淫av片免费播放 | 欧美成人一区二区 | 91精品国产日韩91久久久久久 | 日韩一级精品视频在线观看 | 日韩手机在线视频 | 亚洲欧美一区二区三区视频 | 伊人天堂网| 观看av| 精品视频www| 久久国产精品亚洲 | 午夜国产一级片 | 国产精品一区二区三区久久 | 免费观看一级特黄欧美大片 | 狠狠色狠狠色综合日日92 | 国产成人精品在线播放 | 国产精品一区二区在线 | 精品国产一区二区三区久久 | 亚洲成年影院 | 作爱视频免费观看 | 欧美888 | 国产精品99久久久久久www | 在线观看黄色大片 | 免费观看黄a一级视频 | 欧美区日韩区 | 国产欧美精品一区二区 | 一区二区三区视频在线观看 | 国产激情免费视频 | 国产成人在线免费 | 国产专区在线 | 国产综合精品一区二区三区 | 在线观看免费av网 | 国产精品综合一区二区 | 日韩欧美一区二区三区免费观看 | 成人午夜 | 亚洲电影一级片 | 欧美综合国产精品久久丁香 | 亚洲精品电影网在线观看 | 日韩在线视频精品 |