好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

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

前言

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依赖

?

1

2

3

4

< dependency >

             < groupId >io.quarkus</ groupId >

             < artifactId >quarkus-resteasy-jsonb</ artifactId >

</ dependency >

过滤器filter开发

resteasy的filter

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

/**

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

     }

}

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

vertx的filter

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

/**

  * @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测试数据monPool().submit(()->{

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

             });

             httpServerRequest.headers().forEach(stringStringEntry -> {

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

             });

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

         }, 100 );

     }

}

Quarkus中的跨域

1、Quarkus中解决跨域问题,可以从两个层面来分析,一个是resteasy的角度。resteasy中内置了CorsFilter过滤器,我们只需要激活它即可解决跨域问题。如:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

/**

  * @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就拦截到了请求并做了跨域处理,但是跨域功能默认不是开启的,我们可以基于以下的配置来激活它,并进行相关的设置:

?

1

2

3

4

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的资料请关注其它相关文章!

原文链接:http://HdhCmsTestkailing.pub/article/index/arcid/288.html

查看更多关于Quarkus中filter过滤器跨域cors问题解决方案的详细内容...

  阅读:26次