溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Quarkus中filter過濾器跨域cors問題怎么解決

發(fā)布時間:2022-02-24 11:14:42 來源:億速云 閱讀:288 作者:iii 欄目:開發(fā)技術(shù)

本篇內(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的一大賣點。

    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)了");
        }
    }

    實現(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

    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的角度來實現(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ì)量的實用文章!

    向AI問一下細(xì)節(jié)

    免責(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)容。

    AI