Quarkus中filter過濾器跨域cors問題解決方案
前言
Quarkus中的web模塊是基于java標(biāo)準(zhǔn)web規(guī)范jax-rs構(gòu)建的,實(shí)現(xiàn)則選用了jboss的resteasy。這部分只是請求路由轉(zhuǎn)發(fā)部分實(shí)現(xiàn)。真正的請求接收則使用了eclipse開源的vert.x框架,底層也是基于netty的一個響應(yīng)式開發(fā)框架。Quarkus將vert.x和resteasy集成在了一起,所以支持響應(yīng)式和非響應(yīng)式應(yīng)用混合開發(fā),這也是Quarkus的一大賣點(diǎn)?;谝陨系恼J(rèn)知,我們來看看在Quarkus中,怎么寫過濾器和解決跨域的問題
resteasy4.4.5開發(fā)文檔:https://docs.jboss.org/resteasy/docs/4.5.5.Final
vert'x開發(fā)文檔:https://vertx.io/docs/vertx-web/java/
web依賴
<dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-resteasy-jsonb</artifactId> </dependency>
過濾器filter開發(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("攔截到請求了"); } @Override public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException { System.out.println("攔截到響應(yīng)了"); } }
實(shí)現(xiàn)ContainerRequestFilter、ContainerResponseFilter接口,可以分別攔截請求和響應(yīng)。最后使用@Provider注解標(biāo)記,@Priority注解用于表明優(yōu)先級,值越大,優(yōu)先級越高。前面已經(jīng)說過,Quarkus雖然使用了resteasy,但是請求是使用vert'x來接收的,所以在攔截器實(shí)現(xiàn)里,可以通過上下文信息拿到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中解決跨域問題,可以從兩個層面來分析,一個是resteasy的角度。resteasy中內(nèi)置了CorsFilter過濾器,我們只需要激活它即可解決跨域問題。如:
/** * @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的角度來實(shí)現(xiàn)的,代碼見io.quarkus.vertx.http.runtime.cors.CORSFilter。從vertx的handler就攔截到了請求并做了跨域處理,但是跨域功能默認(rèn)不是開啟的,我們可以基于以下的配置來激活它,并進(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過濾器跨域cors問題解決方案的詳細(xì)內(nèi)容,更多關(guān)于Quarkus中filter過濾器跨域cors的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
kafka 啟動報錯 missingTopicsFatal is true的解決
這篇文章主要介紹了kafka 啟動報錯 missingTopicsFatal is true的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07SpringBoot整合Web開發(fā)之文件上傳與@ControllerAdvice
@ControllerAdvice注解是Spring3.2中新增的注解,學(xué)名是Controller增強(qiáng)器,作用是給Controller控制器添加統(tǒng)一的操作或處理。對于@ControllerAdvice,我們比較熟知的用法是結(jié)合@ExceptionHandler用于全局異常的處理,但其作用不止于此2022-08-08詳解Java MyBatis 插入數(shù)據(jù)庫返回主鍵
這篇文章主要介紹了詳解Java MyBatis 插入數(shù)據(jù)庫返回主鍵,有興趣的可以了解一下。2017-01-01關(guān)于intellij idea打開就閃退或關(guān)閉詳細(xì)解決辦法
這篇文章主要介紹了關(guān)于intellij idea打開就閃退或關(guān)閉詳細(xì)解決辦法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-03-03SpringBoot全局異常與數(shù)據(jù)校驗的方法
這篇文章主要介紹了SpringBoot全局異常與數(shù)據(jù)校驗的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-11-11SpringCloud Config分布式配置中心使用教程介紹
springcloud config是一個解決分布式系統(tǒng)的配置管理方案。它包含了 client和server兩個部分,server端提供配置文件的存儲、以接口的形式將配置文件的內(nèi)容提供出去,client端通過接口獲取數(shù)據(jù)、并依據(jù)此數(shù)據(jù)初始化自己的應(yīng)用2022-12-12SpringBoot整合RabbitMQ的5種模式的注解綁定詳解
這篇文章主要介紹了SpringBoot整合RabbitMQ的5種模式的注解綁定詳解,RabbitMQ 是一個消息中間件,它接收消息并且轉(zhuǎn)發(fā),是"消費(fèi)-生產(chǎn)者模型"的一個典型的代表,一端往消息隊列中不斷的寫入消息,而另一端則可以讀取或者訂閱隊列中的消息,需要的朋友可以參考下2024-01-01