亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

解決spring-boot2.0.6中webflux無法獲得請求IP的問題

2024-07-14 08:42:39
字體:
來源:轉載
供稿:網友

這幾天在用 spring-boot 2 的 webflux 重構一個工程,寫到了一個需要獲得客戶端請求 IP 的地方,發現寫不下去了,在如下的 Handler(webflux 中 Handler 相當于 mvc 中的 Controller)中

import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.http.MediaType;import org.springframework.stereotype.Component;import org.springframework.web.reactive.function.server.RouterFunction;import org.springframework.web.reactive.function.server.ServerRequest;import org.springframework.web.reactive.function.server.ServerResponse;import reactor.core.publisher.Mono;import static org.springframework.web.reactive.function.server.RequestPredicates.GET;import static org.springframework.web.reactive.function.server.RequestPredicates.accept;import static org.springframework.web.reactive.function.server.RouterFunctions.route;/** * 某業務 Handler */@Componentpublic class SplashHandler {  private Mono<ServerResponse> execute(ServerRequest serverRequest) {    ... 業務代碼    // serverRequest 獲得 IP ?    ... 業務代碼  }  @Configuration  public static class RoutingConfiguration {    @Bean    public RouterFunction<ServerResponse> execute(SplashHandler handler) {      return route(          GET("/api/ad").and(accept(MediaType.TEXT_HTML)),          handler::execute      );    }  }}

我發現 org.springframework.web.reactive.function.server.ServerRequest 根本沒有暴露用于獲得客戶端 IP 的 API,想想這在傳統 MVC 中是相當基本的需求啊,竟然獲取不到,然后 Google 了一下,發現這個是 spring-webflux 的一個 BUG ,這個 BUG 在 spring-webflux 5.1 中解決了,但是,略有些尷尬的是當前最新穩定版的 spring-boot 還是依賴 5.0.x 的 spring-webflux 的。難道要等官方升級么,那不知道得等到什么時候,因此我接著搜了搜資料,看了看文檔和源碼,自己想了個曲線救國的辦法。

正文

在 spring-webflux 中,有一個 org.springframework.web.server.WebFilter 接口,類似于 Servlet API 中的過濾器,這個 API 提供了一個方法會將一個限定名為 org.springframework.web.server.ServerWebExchange 的類暴露出來,而在這個類中就包含了對于請求端 IP 的獲取方法:

org.springframework.web.server.ServerWebExchange#getRequestorg.springframework.http.server.reactive.ServerHttpRequest#getRemoteAddress

因此,我們大可以實現一個 WebFilter 在里面通過暴露的 ServerWebExchange 拿到客戶端 IP,然后再將其塞到請求的 header 中,這樣,后續過程就可以從 header 中取 IP 了。思路有了,我們開始實現吧。

過濾、取 IP、放 header,一氣呵成:

import org.springframework.context.annotation.Configuration;import org.springframework.http.server.reactive.ServerHttpRequest;import org.springframework.stereotype.Component;import org.springframework.web.reactive.config.CorsRegistry;import org.springframework.web.reactive.config.WebFluxConfigurer;import org.springframework.web.server.ServerWebExchange;import org.springframework.web.server.WebFilter;import org.springframework.web.server.WebFilterChain;import reactor.core.publisher.Mono;import java.net.InetSocketAddress;import java.util.Objects;/*If you want to keep Spring Boot WebFlux features and you want to add additional WebFlux configuration, you can add your own @Configuration class of type WebFluxConfigurer but without @EnableWebFlux.If you want to take complete control of Spring WebFlux, you can add your own @Configuration annotated with @EnableWebFlux. */@Configurationpublic class WebConfiguration implements WebFluxConfigurer {  @Override  public void addCorsMappings(CorsRegistry registry) {    registry        .addMapping("/**")        .allowedOrigins("*")        .allowedMethods("GET", "POST", "PUT", "PATCH", "DELETE", "OPTION")        .allowedHeaders("header1", "header2", "header3")        .exposedHeaders("header1", "header2")        .allowCredentials(true)        .maxAge(3600);  }  /**   * https://stackoverflow.com/questions/51192630/how-do-you-get-clients-ip-address-spring-webflux-websocket?rq=1   * https://stackoverflow.com/questions/50981136/how-to-get-client-ip-in-webflux   * https://docs.spring.io/spring/docs/current/spring-framework-reference/web-reactive.html#webflux-filters   * 由于在低版本的 spring-webflux 中不支持直接獲得請求 IP(https://jira.spring.io/browse/SPR-16681),因此寫了一個補丁曲線救國,   * 從 org.springframework.web.server.ServerWebExchange 中獲得 IP 后,在放到 header 里   */  @Component  public static class RetrieveClientIpWebFilter implements WebFilter {    @Override    public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {      InetSocketAddress remoteAddress = exchange.getRequest().getRemoteAddress();      String clientIp = Objects.requireNonNull(remoteAddress).getAddress().getHostAddress();      ServerHttpRequest mutatedServerHttpRequest = exchange.getRequest().mutate().header("X-CLIENT-IP", clientIp).build();      ServerWebExchange mutatedServerWebExchange = exchange.mutate().request(mutatedServerHttpRequest).build();      return chain.filter(mutatedServerWebExchange);    }  }}

后續過程 header 取值:

private Mono<ServerResponse> execute(ServerRequest serverRequest) {  String clientIp = serverRequest.headers().asHttpHeaders().getFirst("X-CLIENT-IP")  ... 業務代碼}

通過上述解決方案(其實嚴格上說是 hacking)就解決了我們遇到的問題了。

總結

以上所述是小編給大家介紹的解決spring-boot2.0.6中webflux無法獲得請求IP的問題,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VeVb武林網網站的支持!


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
…久久精品99久久香蕉国产| 精品国产一区二区三区久久久| 黑人巨大精品欧美一区二区免费| 伊人av综合网| 国产成人精品视频| 91情侣偷在线精品国产| 精品欧美国产一区二区三区| 国产精品久久激情| 亚洲黄色在线看| 亚洲女人天堂色在线7777| 亚洲色图校园春色| 国产97人人超碰caoprom| 狠狠躁天天躁日日躁欧美| 欧美激情综合色| 精品欧美激情精品一区| 久久综合伊人77777| 亚洲人成网7777777国产| 海角国产乱辈乱精品视频| 免费av在线一区| 青草热久免费精品视频| 国产在线a不卡| 国产日本欧美一区| 在线观看日韩av| 久久电影一区二区| 日韩国产精品亚洲а∨天堂免| 欧美电影免费看| 欧美一性一乱一交一视频| 岛国av一区二区| 精品国产乱码久久久久久天美| 九九九久久国产免费| 亚洲va久久久噜噜噜| 久久久精品久久久久| 92福利视频午夜1000合集在线观看| 精品亚洲aⅴ在线观看| 亚洲综合社区网| 国产午夜精品一区理论片飘花| 日韩免费视频在线观看| 欧美主播福利视频| 日韩在线视频观看正片免费网站| 91中文精品字幕在线视频| 欧美性猛交xxxx偷拍洗澡| 91黄色8090| 国产精品久久久久久久美男| 亚洲国产欧美久久| 国外成人性视频| 国产精品久久久久久久午夜| 欧美中文字幕在线| 久久伊人91精品综合网站| 亚洲男人天堂2024| 亚洲欧洲视频在线| 91在线免费观看网站| 亚洲精品中文字| 91超碰caoporn97人人| 日韩精品日韩在线观看| 日韩欧美在线播放| 川上优av一区二区线观看| 久久久久久久香蕉网| 91精品国产综合久久香蕉最新版| 精品国产欧美一区二区三区成人| 国产91精品久久久久久久| 欧美精品激情在线| 日韩中文字幕在线免费观看| 精品香蕉在线观看视频一| 麻豆国产精品va在线观看不卡| 97久久精品视频| 2019亚洲男人天堂| 国产精品1234| 亚洲国产精品资源| 国产精品夜色7777狼人| 欧美成人免费全部观看天天性色| 国产亚洲精品综合一区91| 国产精品xxxxx| 色偷偷av一区二区三区乱| 久久九九免费视频| 中文字幕日韩精品在线| 欧美激情在线播放| 国产成人久久久精品一区| 91国偷自产一区二区三区的观看方式| 国产精品18久久久久久首页狼| 久久av中文字幕| 成人天堂噜噜噜| 欧美精品videossex性护士| 91高清视频免费观看| 国产91精品在线播放| 日韩有码视频在线| 日韩视频在线一区| 亚洲国产女人aaa毛片在线| 亚洲天堂男人天堂女人天堂| 欧美精品久久久久久久| 久久精品久久久久| 亚洲天堂第二页| 欧美日韩精品二区| 欧美在线亚洲在线| 性视频1819p久久| 97成人精品区在线播放| 亚洲成人久久一区| 国产日韩在线看| 国产精品扒开腿做爽爽爽的视频| 欧美日韩亚洲精品内裤| 日韩在线视频线视频免费网站| 日韩成人免费视频| 日韩av色在线| 日韩精品高清视频| 欧美黄色片视频| 中文字幕精品国产| xxav国产精品美女主播| 欧美一区亚洲一区| 成人精品一区二区三区电影免费| 欧美中文字幕第一页| 97色在线观看免费视频| 91国自产精品中文字幕亚洲| 欧美日韩国产成人在线观看| 亚洲成人av片在线观看| 色噜噜久久综合伊人一本| 色阁综合伊人av| 91午夜理伦私人影院| 久久久久国产一区二区三区| 国产精品日本精品| 亚洲国产精品成人av| 欧美日韩午夜视频在线观看| 国产精品视频在线观看| 国产精品免费视频xxxx| 久久成人精品电影| 日韩女在线观看| 91高清视频免费观看| 久久久久久国产免费| 在线日韩av观看| 91禁外国网站| 永久免费毛片在线播放不卡| 国产精品热视频| 国产成人久久久| 日韩欧美一区视频| 久久精品免费电影| 欧美日韩成人在线视频| 日韩av不卡在线| 中文字幕亚洲无线码a| 亚洲福利视频网| 亚洲欧美制服中文字幕| 日韩av片电影专区| 中文字幕亚洲字幕| 最近日韩中文字幕中文| 97在线视频免费| 国产综合久久久久久| 国产日韩欧美91| 国产欧美一区二区三区久久人妖| 日韩av电影在线免费播放| 1769国内精品视频在线播放| 国产欧美久久久久久| 亚洲情综合五月天| 精品视频中文字幕| 亚洲午夜av电影| 综合网日日天干夜夜久久| 亚洲国产欧美一区二区三区同亚洲| 136fldh精品导航福利| 国模极品一区二区三区| 亚洲美女在线视频| 国产精品mp4| 亚洲高清在线观看| 精品国产一区二区在线| 九色成人免费视频| 爱福利视频一区| 福利二区91精品bt7086| 91av成人在线| 欧美日韩黄色大片|