Quarkus中filter过滤器跨域cors问题解决方案

网友投稿 568 2022-08-26


Quarkus中filter过滤器跨域cors问题解决方案

目录前言web依赖过滤器filter开发resteasy的filtervertx的filterQuarkus中的跨域

前言

Quarkus中的web模块是基于java标准web规范jax-rs构建的,实现则选用了jboss的resteasy。这部分只是请求路由转发部分实现。真正的请求接收则使用了eclipse开源的vert.x框架,底层也是基于netty的一个响应式开发框架。Quarkus将vert.x和resteasy集成在了一起,所以支持响应式和非响应式应用混合开发,这也是Quarkus的一大卖点。基于以上的认知,我们来看看在Quarkus中,怎么写过滤器和解决跨域的问题

resteasy4.4.5开发文档:https://docs.jboss.org/resteasy/docs/4.5.5.Final

vert'x开发文档:https://vertx.io/docs/vertx-web/java/

web依赖

io.quarkus

quarkus-resteasy-jsonb

过滤器filter开发

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 cuhttp://rrentVertxRequest;

}

@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("拦截到响应了");

}

}

实现ContainerRequestFilter、ContainerResponseFilter接口,可以分别拦截请求和响应。最后使用@Provider注解标记,@Priority注解用于表明优先级,值越大,优先级越高。前面已经说过,Quarkus虽然使用了resteasy,但是请求是使用vert'x来接收的,所以在拦截器实现里,可以通过上下文信息拿到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();

http:// ForkJoinPool.commonPool().submit(()->{

System.out.println("进入vertx拦截器,下面是header参数:");

});

httpServerRequehttp://st.headers().forEach(stringStringEntry -> {

System.out.println("key:"+stringStringEntry.getKey() +",value:"+stringStringEntry.getValue());

});

routingContext.next();//这一句不能漏掉,让拦截器继续往下走的逻辑

}, 100);

}

}

Quarkus中的跨域

1、Quarkus中解决跨域问题,可以从两个层面来分析,一个是resteasy的角度。resteasy中内置了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的角度来实现的,代码见io.quarkus.vertx.http.runtime.cors.CORSFilter。从vertx的handler就拦截到了请求并做了跨域处理,但是跨域功能默认不是开启的,我们可以基于以下的配置来激活它,并进行相关的设置:

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问题解决方案的详细内容,更多关于Quarkus中filter过滤器跨域cors的资料请关注我们其它相关文章!


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Python import导入模块 - reload() 导入的内容
下一篇:Python 进程之间的通信 - 队列Queue(python下载安装教程)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~