前言

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

Quarkus技术交流QQ群:871808563

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

/**

* @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参数:");

});

httpServerRequest.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

filter导致跨域失效_Quarkus中过滤器filter和跨域cors问题(4)相关推荐

  1. 后端传输流跨域_Java开发中解决Js的跨域问题过程解析

    这篇文章主要介绍了Java开发中解决Js的跨域问题过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 主流方法有JSONP和CORS两种,这里记 ...

  2. Spring中过滤器(Filter)和拦截器(Interceptor)的区别和联系

    在我们日常的开发中,我们经常会用到Filter和Interceptor.有时同一个功能.Filter可以做,Interceptor也可以做.有时就需要考虑使用哪一个比较好.这篇文章主要介绍一下,二者的 ...

  3. 详述 Java 中过滤器 Filter 的工作原理及使用方法

    1 简介 Filter 也称之为过滤器,它是 Servlet 技术中最激动人心的技术之一,WEB 开发人员通过 Filter 技术,对 web 服务器管理的所有 web 资源:例如 JSP.Servl ...

  4. SpringBoot项目中过滤器Filter的配置

    目录 一.使用@WebFilter+@ServletComponentScan 具体步骤: 1.新建过滤器类实现Filter,重写doFilter方法 2.在启动类上加@ServletComponen ...

  5. java中过滤器Filter的使用总结【转载】

    1.看了别人写的,觉得获益匪浅,转载下为以后的使用 java中Filter的使用 转载于:https://www.cnblogs.com/FanSunny/p/4877912.html

  6. javaweb过滤器_JavaWeb技术(2):SpringMVC中的Filter

    Filter顾名思义就是过滤器,在JavaWeb体系中,他在服务端,卡在请求/响应与Servlet之间做一些操作: 过滤器相关的类的顶层接口如下,以下方法都由Web容器自动调用: package 你可 ...

  7. JavaWeb过滤器(Filter)详解,是时候该把过滤器彻底搞懂了(万字说明)

            注意:这篇文章很长,学习完后将会解决你对于过滤器(Filter)的所有疑惑,下面将通过理论和代码的结合来进行讲解演示.....  目录 基本介绍 过滤器原理 过滤器(Filter)接口 ...

  8. php p3p跨域登录,php+ajax实现多域名跨域登录例子(基于P3P)

    在以前如果我们要实现php+ajax实现多域名跨域登录的话很多朋友都碰到无法正常跨域登录问题,下面我来给大家解决跨域名登录问题,有需要的参考. 该同步登陆需求需满足以下三个关键点: 1)A域名下登陆的 ...

  9. 过滤器-filter

    过滤器(filter)正如其名,作用就是接收一个输入,通过某个规则进行处理,然后返回处理后的结果.主要用在数据的格式化上,例如获取一个数组中的子集,对数组中的元素进行排序等.ng内置了一些过滤器,它们 ...

最新文章

  1. matlab算法开发与C++调用
  2. 基于半监督学习的单体型组装算法
  3. Traceroute笔记
  4. 计蒜客NOIP模拟赛(2) D2T2紫色百合
  5. 谷歌云盘Colaboratory如何载入文件
  6. php 提交表单跳转页面,form表单页面跳转方式提交练习
  7. Docker笔记整理
  8. Boost:circular_buffer作为边界缓冲区的基础容器
  9. dom 生成图片和链接生成二维码
  10. Operating System-进程/线程内部通信-临界区(Critical Regions)
  11. 移动端的开发-视口-适配
  12. 区块链 Fisco bcos 智能合约(12)-Solidity的高级特性
  13. 决策树CART介绍*
  14. 《燃点》-- 星星之火可以燎原
  15. 全栈之初识JWT -- Web安全的守护神
  16. 点是否在三角形内——C++实现
  17. bde oracle 商友的流程_BDE动态连接Oracle数据库
  18. 2020中国大学生程序设计竞赛(CCPC) - 网络选拔赛 1005 Lunch (杭电 6892)
  19. openlayers官方教程(三)Basics——Zooming to your location
  20. 机器学习-白板推导系列(一)-绪论(机器学习的MLE(最大似然估计)和MAP(最大后验估计))

热门文章

  1. 使用Java来格式化时间
  2. centos7 搭建apache druid
  3. 数据库只有mdf文件而没有ldf文件,如何恢复数据库
  4. MyBatis使用小案例
  5. Python操作MySQL存储,这些你都会了吗?
  6. Codeforces 847H - Load Testing
  7. volatile 和 atomic 原子性的区别和联系
  8. 现实世界的Windows Azure:与iQmetrix的市场营销副总裁Anne Weiler对话
  9. xaml 的 intellisense失效的解决办法
  10. Linux下基于 Docker 搭建 MySQL 主从复制(1 Master+2 Slave)