您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“Quarkus中filter過濾器跨域cors問題怎么解決”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
Quarkus中的web模塊是基于java標(biāo)準(zhǔn)web規(guī)范jax-rs構(gòu)建的,實現(xiàn)則選用了jboss的resteasy。這部分只是請求路由轉(zhuǎn)發(fā)部分實現(xiàn)。真正的請求接收則使用了eclipse開源的vert.x框架,底層也是基于netty的一個響應(yīng)式開發(fā)框架。Quarkus將vert.x和resteasy集成在了一起,所以支持響應(yīng)式和非響應(yīng)式應(yīng)用混合開發(fā),這也是Quarkus的一大賣點。
<dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-resteasy-jsonb</artifactId> </dependency>
/** * @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)了"); } }
實現(xiàn)ContainerRequestFilter、ContainerResponseFilter接口,可以分別攔截請求和響應(yīng)。最后使用@Provider注解標(biāo)記,@Priority注解用于表明優(yōu)先級,值越大,優(yōu)先級越高。前面已經(jīng)說過,Quarkus雖然使用了resteasy,但是請求是使用vert'x來接收的,所以在攔截器實現(xiàn)里,可以通過上下文信息拿到vert'x的路由信息RoutingContext
/** * @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); } }
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的角度來實現(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問題怎么解決”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。