Quarkus中filter過(guò)濾器跨域cors問(wèn)題解決方案
前言
Quarkus中的web模塊是基于java標(biāo)準(zhǔn)web規(guī)范jax-rs構(gòu)建的,實(shí)現(xiàn)則選用了jboss的resteasy。這部分只是請(qǐng)求路由轉(zhuǎn)發(fā)部分實(shí)現(xiàn)。真正的請(qǐng)求接收則使用了eclipse開(kāi)源的vert.x框架,底層也是基于netty的一個(gè)響應(yīng)式開(kāi)發(fā)框架。Quarkus將vert.x和resteasy集成在了一起,所以支持響應(yīng)式和非響應(yīng)式應(yīng)用混合開(kāi)發(fā),這也是Quarkus的一大賣點(diǎn)?;谝陨系恼J(rèn)知,我們來(lái)看看在Quarkus中,怎么寫(xiě)過(guò)濾器和解決跨域的問(wèn)題
resteasy4.4.5開(kāi)發(fā)文檔:https://docs.jboss.org/resteasy/docs/4.5.5.Final
vert'x開(kāi)發(fā)文檔:https://vertx.io/docs/vertx-web/java/
web依賴
<dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-resteasy-jsonb</artifactId> </dependency>
過(guò)濾器filter開(kāi)發(fā)
resteasy的filter
/** * @author kl : http://kailing.pub * @version 1.0 * @date 2020/7/9 15:34 */ @Priority(Priorities.USER + 1) @Provider public class MyFilter implements ContainerRequestFilter, ContainerResponseFilter { private volatile CurrentVertxRequest currentVertxRequest; CurrentVertxRequest currentVertxRequest() { if (currentVertxRequest == null) { currentVertxRequest = CDI.current().select(CurrentVertxRequest.class).get(); } return currentVertxRequest; } @Override public void filter(ContainerRequestContext requestContext) throws IOException { RoutingContext httpServerRequest = this.currentVertxRequest().getCurrent(); String str = httpServerRequest.getBodyAsString(); JsonObject jsonObject = httpServerRequest.getBodyAsJson(); RequestImpl request = (RequestImpl) requestContext.getRequest(); System.out.println("攔截到請(qǐng)求了"); } @Override public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException { System.out.println("攔截到響應(yīng)了"); } }
實(shí)現(xiàn)ContainerRequestFilter、ContainerResponseFilter接口,可以分別攔截請(qǐng)求和響應(yīng)。最后使用@Provider注解標(biāo)記,@Priority注解用于表明優(yōu)先級(jí),值越大,優(yōu)先級(jí)越高。前面已經(jīng)說(shuō)過(guò),Quarkus雖然使用了resteasy,但是請(qǐng)求是使用vert'x來(lái)接收的,所以在攔截器實(shí)現(xiàn)里,可以通過(guò)上下文信息拿到vert'x的路由信息RoutingContext
vertx的filter
/** * @author kl : http://kailing.pub * @version 1.0 * @date 2020/7/9 18:15 */ @ApplicationScoped public class MyFilter { public void initfilter(@Observes Filters filters) { filters.register(routingContext -> { HttpServerRequest httpServerRequest = routingContext.request(); ForkJoinPool.commonPool().submit(()->{ System.out.println("進(jìn)入vertx攔截器,下面是header參數(shù):"); }); httpServerRequest.headers().forEach(stringStringEntry -> { System.out.println("key:"+stringStringEntry.getKey() +",value:"+stringStringEntry.getValue()); }); routingContext.next();//這一句不能漏掉,讓攔截器繼續(xù)往下走的邏輯 }, 100); } }
Quarkus中的跨域
1、Quarkus中解決跨域問(wèn)題,可以從兩個(gè)層面來(lái)分析,一個(gè)是resteasy的角度。resteasy中內(nèi)置了CorsFilter過(guò)濾器,我們只需要激活它即可解決跨域問(wèn)題。如:
/** * @author kl : http://kailing.pub * @version 1.0 * @date 2020/7/9 16:46 */ @Provider public class CorsFilter extends org.jboss.resteasy.plugins.interceptors.CorsFilter { public CorsFilter() { super.setAllowedMethods("OPTIONS, GET, POST, DELETE, PUT, PATCH"); super.setAllowedHeaders("*"); super.getAllowedOrigins().add("*"); } }
2、Quarkus本身也做了跨域的解決方案,是基于vert't的角度來(lái)實(shí)現(xiàn)的,代碼見(jiàn)io.quarkus.vertx.http.runtime.cors.CORSFilter。從vertx的handler就攔截到了請(qǐng)求并做了跨域處理,但是跨域功能默認(rèn)不是開(kāi)啟的,我們可以基于以下的配置來(lái)激活它,并進(jìn)行相關(guān)的設(shè)置:
quarkus.http.cors=true quarkus.http.cors.origins=* quarkus.http.cors.headers=accept, authorization, content-type, x-requested-with quarkus.http.cors.methods=GET, OPTIONS
以上就是Quarkus中filter過(guò)濾器跨域cors問(wèn)題解決方案的詳細(xì)內(nèi)容,更多關(guān)于Quarkus中filter過(guò)濾器跨域cors的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
kafka 啟動(dòng)報(bào)錯(cuò) missingTopicsFatal is true的解決
這篇文章主要介紹了kafka 啟動(dòng)報(bào)錯(cuò) missingTopicsFatal is true的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07SpringBoot整合Web開(kāi)發(fā)之文件上傳與@ControllerAdvice
@ControllerAdvice注解是Spring3.2中新增的注解,學(xué)名是Controller增強(qiáng)器,作用是給Controller控制器添加統(tǒng)一的操作或處理。對(duì)于@ControllerAdvice,我們比較熟知的用法是結(jié)合@ExceptionHandler用于全局異常的處理,但其作用不止于此2022-08-08詳解Java MyBatis 插入數(shù)據(jù)庫(kù)返回主鍵
這篇文章主要介紹了詳解Java MyBatis 插入數(shù)據(jù)庫(kù)返回主鍵,有興趣的可以了解一下。2017-01-01關(guān)于intellij idea打開(kāi)就閃退或關(guān)閉詳細(xì)解決辦法
這篇文章主要介紹了關(guān)于intellij idea打開(kāi)就閃退或關(guān)閉詳細(xì)解決辦法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03SpringBoot全局異常與數(shù)據(jù)校驗(yàn)的方法
這篇文章主要介紹了SpringBoot全局異常與數(shù)據(jù)校驗(yàn)的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-11-11SpringCloud Config分布式配置中心使用教程介紹
springcloud config是一個(gè)解決分布式系統(tǒng)的配置管理方案。它包含了 client和server兩個(gè)部分,server端提供配置文件的存儲(chǔ)、以接口的形式將配置文件的內(nèi)容提供出去,client端通過(guò)接口獲取數(shù)據(jù)、并依據(jù)此數(shù)據(jù)初始化自己的應(yīng)用2022-12-12MyBatis高級(jí)映射ResultMap解決屬性問(wèn)題
對(duì)于數(shù)據(jù)庫(kù)中對(duì)表的增刪改查操作,我們知道增刪改都涉及的是單表,而只有查詢操作既可以設(shè)計(jì)到單表操作又可以涉及到多表操作,所以對(duì)于輸入映射parameterType而言是沒(méi)有所謂的高級(jí)映射的,也就是說(shuō)高級(jí)映射只針對(duì)于輸出映射2023-02-02SpringBoot整合RabbitMQ的5種模式的注解綁定詳解
這篇文章主要介紹了SpringBoot整合RabbitMQ的5種模式的注解綁定詳解,RabbitMQ 是一個(gè)消息中間件,它接收消息并且轉(zhuǎn)發(fā),是"消費(fèi)-生產(chǎn)者模型"的一個(gè)典型的代表,一端往消息隊(duì)列中不斷的寫(xiě)入消息,而另一端則可以讀取或者訂閱隊(duì)列中的消息,需要的朋友可以參考下2024-01-01