Quarkus中filter過濾器跨域cors問題解決方案
前言
Quarkus中的web模塊是基于java標準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的一大賣點。基于以上的認知,我們來看看在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)了");
}
}實現(xiàn)ContainerRequestFilter、ContainerResponseFilter接口,可以分別攔截請求和響應(yīng)。最后使用@Provider注解標記,@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("進入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就攔截到了請求并做了跨域處理,但是跨域功能默認不是開啟的,我們可以基于以下的配置來激活它,并進行相關(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)容,更多關(guān)于Quarkus中filter過濾器跨域cors的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SpringBoot整合Minio的過程(支持公有及私有bucket)
Bucket 是存儲Object的邏輯空間,每個Bucket之間的數(shù)據(jù)是相互隔離的,對用戶而言,相當于存放文件的頂層文件夾,這篇文章主要介紹了SpringBoot整合Minio的過程(支持公有及私有bucket),需要的朋友可以參考下2025-03-03
SpringBoot對靜態(tài)資源的映射規(guī)則詳解解讀
這篇文章主要介紹了SpringBoot對靜態(tài)資源的映射規(guī)則詳解解讀,在Spring Boot中,映射規(guī)則是用來定義URL與控制器方法之間的映射關(guān)系的,通過映射規(guī)則,可以將特定的URL請求映射到相應(yīng)的控制器方法上,從而實現(xiàn)請求的處理和響應(yīng)的返回,需要的朋友可以參考下2023-10-10
Java壓縮解壓zip技術(shù)_動力節(jié)點Java學院整理
Java解壓縮zip - 多個文件(包括文件夾),對多個文件和文件夾進行壓縮,對復(fù)雜的文件目錄進行解壓。壓縮方法使用的是可變參數(shù),可以壓縮1到多個文件2017-05-05
Hibernate Validation自定義注解校驗的實現(xiàn)
這篇文章主要介紹了Hibernate Validation自定義注解校驗的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-04-04
關(guān)于@JsonProperty和@JSONField注解的區(qū)別及用法
這篇文章主要介紹了關(guān)于@JsonProperty和@JSONField注解的區(qū)別及用法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-08-08

