filter导致跨域失效_Quarkus中过滤器filter和跨域cors问题(4)
前言
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)相关推荐
- 后端传输流跨域_Java开发中解决Js的跨域问题过程解析
这篇文章主要介绍了Java开发中解决Js的跨域问题过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 主流方法有JSONP和CORS两种,这里记 ...
- Spring中过滤器(Filter)和拦截器(Interceptor)的区别和联系
在我们日常的开发中,我们经常会用到Filter和Interceptor.有时同一个功能.Filter可以做,Interceptor也可以做.有时就需要考虑使用哪一个比较好.这篇文章主要介绍一下,二者的 ...
- 详述 Java 中过滤器 Filter 的工作原理及使用方法
1 简介 Filter 也称之为过滤器,它是 Servlet 技术中最激动人心的技术之一,WEB 开发人员通过 Filter 技术,对 web 服务器管理的所有 web 资源:例如 JSP.Servl ...
- SpringBoot项目中过滤器Filter的配置
目录 一.使用@WebFilter+@ServletComponentScan 具体步骤: 1.新建过滤器类实现Filter,重写doFilter方法 2.在启动类上加@ServletComponen ...
- java中过滤器Filter的使用总结【转载】
1.看了别人写的,觉得获益匪浅,转载下为以后的使用 java中Filter的使用 转载于:https://www.cnblogs.com/FanSunny/p/4877912.html
- javaweb过滤器_JavaWeb技术(2):SpringMVC中的Filter
Filter顾名思义就是过滤器,在JavaWeb体系中,他在服务端,卡在请求/响应与Servlet之间做一些操作: 过滤器相关的类的顶层接口如下,以下方法都由Web容器自动调用: package 你可 ...
- JavaWeb过滤器(Filter)详解,是时候该把过滤器彻底搞懂了(万字说明)
注意:这篇文章很长,学习完后将会解决你对于过滤器(Filter)的所有疑惑,下面将通过理论和代码的结合来进行讲解演示..... 目录 基本介绍 过滤器原理 过滤器(Filter)接口 ...
- php p3p跨域登录,php+ajax实现多域名跨域登录例子(基于P3P)
在以前如果我们要实现php+ajax实现多域名跨域登录的话很多朋友都碰到无法正常跨域登录问题,下面我来给大家解决跨域名登录问题,有需要的参考. 该同步登陆需求需满足以下三个关键点: 1)A域名下登陆的 ...
- 过滤器-filter
过滤器(filter)正如其名,作用就是接收一个输入,通过某个规则进行处理,然后返回处理后的结果.主要用在数据的格式化上,例如获取一个数组中的子集,对数组中的元素进行排序等.ng内置了一些过滤器,它们 ...
最新文章
- matlab算法开发与C++调用
- 基于半监督学习的单体型组装算法
- Traceroute笔记
- 计蒜客NOIP模拟赛(2) D2T2紫色百合
- 谷歌云盘Colaboratory如何载入文件
- php 提交表单跳转页面,form表单页面跳转方式提交练习
- Docker笔记整理
- Boost:circular_buffer作为边界缓冲区的基础容器
- dom 生成图片和链接生成二维码
- Operating System-进程/线程内部通信-临界区(Critical Regions)
- 移动端的开发-视口-适配
- 区块链 Fisco bcos 智能合约(12)-Solidity的高级特性
- 决策树CART介绍*
- 《燃点》-- 星星之火可以燎原
- 全栈之初识JWT -- Web安全的守护神
- 点是否在三角形内——C++实现
- bde oracle 商友的流程_BDE动态连接Oracle数据库
- 2020中国大学生程序设计竞赛(CCPC) - 网络选拔赛 1005 Lunch (杭电 6892)
- openlayers官方教程(三)Basics——Zooming to your location
- 机器学习-白板推导系列(一)-绪论(机器学习的MLE(最大似然估计)和MAP(最大后验估计))