【踩坑记录】SpringBoot跨域配置不生效

问题复现:

明明在拦截器里配置了跨域,就是不生效,使用PostMan等后端调试工具调试,均正常,Response中有Access-Control-Allow-Origin: *,这个Header,但是前端一直反馈,通过浏览器js代码fetch报跨域问题。如图:

 

 嗯,,,看看浏览器请求:

 

 确实在报CORS错误

问题分析:

看到这个浏览器请求对http比较了解的同学可能已经猜到大概了,对于非Simple请求,浏览器会先发送一次OPTIONS请求,坑就在这里,如果我们用了自定义的header,就不是Simple请求,意味着会发送一次OPTIONS,就是上面浏览器调试工具中的preflight,就是这个请求出现了跨域问题。继续分析后端代码,问题出现了:

本次项目安全认证做在了Filter中,其实这个没问题,好多项目都是在Filter中做的安全认证,不过,它的CORS配置配在了拦截器中(Interceptor),而且在权限认证Filter认证失败时直接返回,导致没有经过拦截器,直接返回了。不过这种情况也不正常,因为即使安全认证没通过的请求没经过过滤器直接返回了,那正常能通过安全认证的请求应该正常返回跨域啊,为什么通过postman请求一切正常,浏览器却报错呢?原因就是我们上面提到的,后端没有对OPTIONS请求做单独处理,意味着OPTIONS请求也会经过安全认证的Filter,而浏览器发出的OPTIONS请求是没有携带安全认证Header的,所以必然认证失败,然后直接返回,没有加CORS的Header,导致请求本身能访问,但preflight过不了安全认证Filter访问不了,直接返回跨域问题。

问题解决:

找到原因,剩下的就比较简单了,把CORS配置放到Filter上,并且把优先级提高,起码要在AuthFilter之前,再测试没问题啦

 

 

本文转载于网络 如有侵权请联系删除

相关文章

  • 挖坑系列之Fx初窥

    当我们谈到web服务时,使用Java的小伙伴第一反应肯定是Spring全家桶,虽然约定大于配置的SpringBoot相比最初Spring版本在易用性、开发效率方便已经有了长足的进步,但是其API还是相对较繁杂。因此欢迎大家来到golang的世界,这里的一切都尽可能简单。实现一个可以与浏览器交互输出"helloworld"的web服务的典型做法是启动一个HTTP服务并运行自定义的路由。以下代码片段,我们通过使用Go内置net/http包不需要外部依赖即可实现。Filename:server/server.go import"net/http" //Handlerforhttprequests typeHandlerstruct{ mux*http.ServeMux } //Newhttphandler funcNew(s*http.ServeMux)*Handler{ h:=Handler{s} h.registerRoutes() return&h } //RegisterRoutesforallhttpendpoints fun

  • Webpack配置

    Webpack配置入口和出口我们考虑一下,如果每次使用webpack的命令都需要写上入口和出口作为参数,就非常麻烦,有没有一种方法可以将这两个参数写到配置中,在运行时,直接读取呢?当然可以,就是创建一个webpack.config.js文件局部安装webpack目前,我们使用的webpack是全局的webpack,如果我们想使用局部来打包呢?因为一个项目往往依赖特定的webpack版本,全局的版本可能很这个项目的webpack版本不一致,导出打包出现问题。所以通常一个项目,都有自己局部的webpack。第一步,项目中需要安装自己局部的webpack这里我们让局部安装webpack3.6.0VueCLI3中已经升级到webpack4,但是它将配置文件隐藏了起来,所以查看起来不是很方便。第二步,通过node_modules/.bin/webpack启动webpack打包package.json中定义启动但是,每次执行都敲这么一长串有没有觉得不方便呢?OK,我们可以在package.json的scripts中定义自己的执行脚本。package.json中的scripts的脚本在执行时,会按照

  • Egg 中获取远程的数据

    Egg提供了this.ctx.curl方法获取远程的数据,让我们可以轻松的实现一个简单的爬虫功能,以下是一个使用的具体示例。首先在config文件夹下的config.default.js中定义要获取数据的域名。'usestrict'; module.exports=appInfo=>{ constconfig=exports={}; //useforcookiesignkey,shouldchangetoyourownandkeepsecurity config.keys=appInfo.name+'_1532656413112_8161'; //addyourconfighere config.middleware=[]; //配置公共的请求域名 config.api='http://www.phonegap100.com/'; returnconfig; };复制然后在service文件夹下添加服务的文件news.js,并在文件中添加服务的方法getNewsList和getNewsContent,分别获取新

  • Flink教程-flink 1.11 流式数据ORC格式写入file

    StreamingFileSink简介写入orc工厂类向量化操作构造OrcBulkWriterFactory实例讲解构造source构造OrcBulkWriterFactory构造StreamingFileSink在flink中,StreamingFileSink是一个很重要的把流式数据写入文件系统的sink,可以支持写入行格式(json,csv等)的数据,以及列格式(orc、parquet)的数据。 hive作为一个广泛的数据存储,而ORC作为hive经过特殊优化的列式存储格式,在hive的存储格式中占有很重要的地位。今天我们主要讲一下使用StreamingFileSink将流式数据以ORC的格式写入文件系统,这个功能是flink1.11版本开始支持的。StreamingFileSink简介StreamingFileSink提供了两个静态方法来构造相应的sink,forRowFormat用来构造写入行格式数据的sink,forBulkFormat方法用来构造写入列格式数据的sink,我们看一下方法forBulkFormat。publicstatic<IN>Streamin

  • dbSUPER:人和小鼠中的超级增强子数据库

    欢迎关注”生信修炼手册”!dbSUPER是超级增强子数据库的开山之作,文章发表在NucleicAcidsResearch上,链接如下https://academic.oup.com/nar/article/44/D1/D164/2502575该数据库的网址如下http://asntech.org/dbsuper/收录了人和小鼠中的超级增强子信息,采用了两种策略来定义增强子从pubMed中收集已发表的,有文献支持的超级增强子利用从ENCODE,GEO等公共数据库中下载的H3K27acchip_seq数据,采用MACS识别peak区域,将p小于10的负9次方的peak作为增强子区,然后采用ROSE这款软件来识别超级增强子区 对于human而言,基于hg19版本进行分析,共收录了来自102种不同细胞/组织共69205个超级增强子;对于mouse而言,基于mm9版本进行分析,共收录了来自25种不同细胞/组织共13029个超级增强子信息,图示如下将超级增强子上下游50kb范围内存在的基因作为对应的靶基因,基于这种简单的策略来预测超级增强子的靶基因。整个数据库构建的pipeline示意如下通过B

  • Zabbix历史数据处理办法

    Zabbix历史数据处理办法方法一:本想删除某一时间戳之前的历史数据date"+%s"-d"20150101"1420041600SELECTTABLE_NAMEAS"Table",round(((data_length+index_length)/1024/1024),2)ASSize_in_MBFROMinformation_schema.TABLES WHEREtable_schema='zabbix'ORDERBYSize_in_MBDESCLIMIT10;  +----------------+------------+|Table     |Size_in_MB|+----------------+------------+|history_uint | 189699.00| |history    | 111647.00| |trends_uint  |  6322.92| |trends    |  1822.00| |events    |  1252.00| |history_str  

  • 一周AI回顾 | 特斯拉AI负责人说神经网络正在改变编程,机器学习大神Bengio新论文专注RNN优化

    本期一周AI看点包括行业热点、投融资、业界观点、技术前沿以及应用等方面。行业英特尔将同AMD合作PC芯片共同对抗英伟达《华尔街日报》援引知情人士的消息称,英特尔将发布一款移动处理器,该处理器整合了英特尔的处理器和AMD的图形处理器,主要面向超薄、超轻、功能强大的高端笔记本电脑市场。该CPU基于英特尔的KabyLake架构,GPU部分则采用AMD的Radeon核显。预测:网络安全市场的AI规模2023将达1207亿元据P&S市场研究公司预测,全球网络安全市场的AI(人工智能)规模2023年将达到182亿美元(约合人民币1207.8亿元)。鉴于AI有助于识别威胁,并保护组织机构的数据免于遭受网络攻击,未来将在网络安全行业发挥重要作用。AI可加速攻击识别过程,以便组织机构采取预防措施打击网络犯罪。三星悄然确认了Exynos9810处理器,采用10nm工艺且有AI芯片三星并未公布详细的Exynos9810规格细节,只表示这是一款采用第二代10nm工艺打造的旗舰处理器,将会搭载第三代的定制化CPU核心,GPU基于MailiG72打造的多核。配备全球首款支持6CA(载波聚合)的千兆级LTE

  • 一张图大神带你了解游戏程序员的学习之路

    作者介绍:叶劲峰(MiloYip)现任腾讯T4专家、互动娱乐事业群魔方工作室群前台技术总监。 中国香港大学认知科学学士(BCogSc)、中国香港中文大学系统工程及工程管理哲学硕士(MPhil)。他是《游戏引擎架构》译者、《C++Primer中文版(第五版)》审校。他曾参与《天涯明月刀》、《斗战神》、《爱丽丝:疯狂回归》、《美食从天降》、《王子传奇》等游戏项目,以及多个游戏引擎及中间件的研发。 开源项目RapidJSON的作者,开发nativejson-benchmark比较41个开源原生JSON库的标准符合程度及性能。他在1990年学习C语言,1995年开始使用C++于各种项目。 上图中展示的书籍表示游戏程序员可能/应该获得的知识/技能。当然,其它的学习方式也很重要,例如练习、课程、产业/学术会议/出版物等。 原文来自:https://github.com/miloyip/game-programmer

  • 【Python机器学习实战】聚类算法(2)——层次聚类(HAC)和DBSCAN

    层次聚类和DBSCAN   前面说到K-means聚类算法,K-Means聚类是一种分散性聚类算法,本节主要是基于数据结构的聚类算法——层次聚类和基于密度的聚类算法——DBSCAN两种算法。 1.层次聚类   下面这样的结构应该比较常见,这就是一种层次聚类的树结构,层次聚类是通过计算不同类别点的相似度创建一颗有层次的树结构,在这颗树中,树的底层是原始数据点,顶层是一个聚类的根节点。   创建这样一棵树的方法有自底向上和自顶向下两种方式。   下面介绍一下如何利用自底向上的方式的构造这样一棵树:   为了便于说明,假设我们有5条数据,对这5条数据构造一棵这样的树,如下是5条数据:   第一步,计算两两样本之间相似度,然后找到最相似两条数据(假设1、2两个最相似),然后将其merge起来,成为1条数据:   现在数据还剩4条,然后同样计算两两之间的相似度,找出最相似的两条数据(假设前两条最相似),然后再merge起来:   现在还剩余3条数据,然后继续重复上面的步骤,假设后面两条数据最相似,那么:   然后还剩余两条数据,再把这两条数据merge起来,最终完成一个树的构建:   上

  • 一台服务器上同时部署多个tomcat8.5以上版本配置

    第一步修改tomcat关闭端口 打开tomcat中conf文件夹下的server.xml文件,修改port=“8006”默认是8005;每一个tomcat的这个端口都不能重复。   第二步给每个tomcat窗口重命名 打开tomcat中bin文件夹下的catalina.bat文件,修改TITLE=Tomcat8081或者其他名称,默认名称:Tomcat;   运行 通过以上步骤完成配置之后,分别启动tomcat,多个tomcat窗口可以单独运行和单独关闭,并且tomcat打开的窗口名称也已经修改为根据自己自定义的名称。 注:以上tomcat配置未在环境变量中进行任何配置。若已有设置,则再操作以下。   修改方法(共三个文件:catalina.bat,startup.bat,shutdown.bat) 直接修改startup.bat文件,设置CATALINA_HOME默认值。设置成tomcat安装路径即可 setCATALINA_HOME=D:\apache-tomcat-7.2.1 复制     启动tomcat的文件start

  • oracle pdb创建及用户创建

    https://blog.csdn.net/qq877507054/article/details/81209967 oracle12c安装时会默认创建pdb数据库:pdborcl,可以修改名称       1、cmd命令 >sqlplus/assysdba >showpdbs    >alterplugabledatabasepdborclopen; >altersessionsetcontainer=PDBORCL; >createusersyspdbidentifiedbysyspdb; >grantdbatosyspdb;   2、修改listener.ora和tnsname.ora(安装目录下查找)   配置监听 这里假定CDB数据库名为ORCL,PDB在CDB下面名称为PDBORCLlistener.ora添加(#后面为注释,不要添加进去)      SID_LIST_LISTENER= (SID_LIST= (SID_DESC= (GLOBAL_DBNAME

  • python flatten()函数的作用和用法

    flatten()函数可以执行展平操作,返回一个一维数组。 函数的作用对象是数组array、矩阵mat,不能直接用于列表list。 x.flatten()是把numpy对象x降低到一维,默认是按照行来降维的,等同于x.flatten('A') 想要按照列的方向降维,格式为:x.flatten('F')。 代码示例:   补充:     如果有用欢迎给我点个赞哦

  • vue学习day01

    Vue是一套用于构建用户界面的渐进式框架,与其他大型框架不同的是,Vue被设计成自底向上逐层应用。Vue的核心只关注视图层。 HTML+CSS+JS:视图,给用户看,刷新后台给的数据 网络通信:axios 页面跳转:vue-router 状态管理:vuex VueUI: 1,element-前端三大框架:Angular(MVVM) 2,React:虚拟DOM 3.Vue MVVM M:model模型层,在这里表示javascript对象。 V:view视图层,在这里表示DOM(HTML操作的元素) VM:viewmodel连接视图和数据的中间件,Vue.js就是MVVM中的ViewModel层的实现者 MVVM架构中,不允许数据和视图直接通信,只能通过ViewModel来通信,ViewModel就是定义了一个Observer观察者 ViewModel能够观察到数据的变化,并对应视图内容进行更新 ViewModel能够观察到视图的变化,并能够通知数据发生改变  

  • 【洛谷 p3382】模板-三分法(算法效率)

    题目:给出一个N次函数,保证在范围[l,r]内存在一点x,使得[l,x]上单调增,[x,r]上单调减。试求出x的值。 解法:与二分法枚举中点使区间分成2份不一样,三分法是枚举三分点,再根据题目的情况修改l,r。 P.S.嘻嘻,其实我就是为了凑够我这3个月博客刚好150篇才补了这个我NOIP比赛临出发打的题。 1#include<cstdio> 2#include<cstdlib> 3#include<cstring> 4#include<iostream> 5usingnamespacestd; 6#defineeps1e-8 7 8intn; 9doublea[15]; 10 11doublemabs(doublex){returnx>0?x:-x;} 12doublef(doublex) 13{ 14doubleh=0.0,tmp=1.0; 15for(inti=0;i<=n;i++) 16{ 17h+=tmp*a[i]; 18tmp*=x; 19} 20returnh; 21} 22intmain() 23{ 24do

  • ArcGIS Viewer for Flex中引入google map作底图

         在ArcGISViewerforFlex开发中,经常需要用到googlemap作为底图,我们不能通过ArcGISViewerforFlex-ApplicationBuilder轻易的引入googlemap作为底图,需要通过程序重写TiledMapServiceLayer来扩展从而加载googlemap。        这里有写好的GoogleMapLayer.as文件: packagecom.esri.viewer { importcom.esri.ags.SpatialReference; importcom.esri.ags.geometry.Extent; importcom.esri.ags.geometry.MapPoint; importcom.esri.ags.layers.TiledMapServiceLayer; importcom.esri.ags.layers.supportClasses.LOD; importcom.esri.ags.layers.supportClasses.TileInfo; importflash.net.URLR

  • tcl/tk编译

    参考:http://www.tcl.tk/doc/howto/compile.html#win可下载已编译好的bin版本:https://bitbucket.org/tombert/tcltk/downloads/1.下载tcl-tk库http://www.tcl-lang.org/https://nchc.dl.sourceforge.net/project/tcl/Tcl/8.6.10/tcl8610-src.ziphttps://nchc.dl.sourceforge.net/project/tcl/Tcl/8.6.10/tcl8610-src.zip2.将下载后的文件解压到如下目录E:\osg\tcl-tk\tcl8.6.10与E:\osg\tcl-tk\tk8.6.10并创建如下目录:E:\osg\tcl-tk\tcltk3.编译打开X64NativeToolsCommandPromptforVS2019程序3.1TCLcdE:\osg\tcl-tk\tcl8.6.10\winnmake-fmakefile.vcINSTALLDIR=E:/osg/tcl-tk/tcltknm

  • git cz 无效的解决笔记

    在cmd或者powershell敲入命令行:npminstall-gcommitizen 进入工程项目仓库,使用npminit--yes生成package.json文件. 输入commitizeninitcz-conventional-changelog--save--save-exact//这句命令会自动帮你在项目安装cz-conventional-changelog包,并且帮你在package.son利进行配置,下图就是帮你添加的配置。 然后输入gitcz就有效果了 References gitcz配置

  • .NetCore 缓存技术

    缓存分很多级, 浏览器缓存、网关缓存、Web服务器缓存、数据库缓存。   1、首先可以在Action方法上边可以放一个ResponseCach的Attribute来指定浏览器的缓存时长   缓存20秒   2、服务器端缓存,第一个浏览器请求数据之后,服务器端进行了缓存,那其他浏览器再来请求时,就可以使用服务器端的请求。 但可以通过请求头中的cach-control:no-cache来禁用这种缓存       3、自己设置缓存信息,内存缓存(常用)     缓存设置过期时间,是一个动态过期时间,防止同一时间过期,造成数据库崩溃。注意Random的用法是.NetCore里的用法,在FrameWork里可以自己定义一个静态的Random,不要每次都new一个。     推荐使用GetOrCreate方法,可以防止缓存穿透,即将数据库查询不到的空数据也存到内存,具体信息可以看视频: Part4-28:ASP.NETCore缓存穿透的问题_哔哩哔哩_bilibili  

  • 微服务实战(一):微服务架构的优势与不足

    【编者的话】本文来自Nginx官方博客,是微服务系列文章的第一篇,主要探讨了传统的单体式应用的不足,以及微服务架构的优势与挑战。正如作者所说,微服务架构更适合用于构建复杂的应用,尽管它也有自己的不足。这篇文章作者是ChrisRichardson,他是早期基于Java的AmazoniteEC2PaaS平台CloudFoundry.com的创始人。现在他为企业提供如何开发和部署应用的咨询服务。他也经常在http://microservices.io上发表有关微服务的文章。微服务正在博客、社交媒体讨论组和会议演讲中获得越来越多的关注,在Gartner的2014HypeCycle上它的排名非常靠前。同时,软件社区中也有不少持怀疑论者,认为微服务不是什么新东西。Naysayers认为这就是SOA架构的重新包装。然而,尽管存在着不同的争论,微服务架构模式却正在为敏捷部署以及复杂企业应用实施提供巨大的帮助。这篇博客是关于如何设计、开发和部署微服务的七篇系列文章中的第一篇。读者将会从中学到方法,并且和单体式架构模式(译者注:本文中会将Monolithic翻译为单体)进行对比。这一系列文章将描述微服务架

  • 【基础复习】七:继承与接口

    覆盖 面试题 构造函数从最初始的基类开始构造,各个类的同名变量没有形成覆盖,都是单独的变量 就近调用。如果派生类没有定义相关接口,父辈存在相关接口则优先调用父辈接口,如果父辈也不存在相关接口则调用祖父辈接口。 派生类的虚函数会覆盖基类的虚函数,因此不管是用什么指针指向内存中的派生类,调用的都是派生类自己的虚函数。 私有继承 私有继承使对象不能被派生类的子类访问 如果不指定public,c++默认的是私有继承 子类只能继承父类的protected和public 在无继承的类中,protected和private是没有区别的 一个私有的或保护的派生类不是子类,因为非公共的派生类不能做基类能做的所有的事 继承和多重继承一般考虑的是公共继承 公有继承。在公有继承时,基类的公有成员和保护成员在派生类中保持原来状态。派生类的对象可以访问基类中的公有成员,派生类的成员函数可以访问基类中的公有成员和保护成员。 私有继承。在私有继承时,基类的公有成员和保护成员在派生类中变成私有成员。基类的成员只能由直接派生类访问,而无法再往下继承。 保护继承。在保护继承时,基类的公有成员和保护成员在派生类中变

  • 窄带陷波滤波器(Notch filter)

    陷波滤波器指的是可以将某一频率迅速衰减的滤波器。 在伺服控制领域比较常用来抑制控制系统的共振点,通过对共振点精确的频率陷波,既消除了振动又不影响控制效果。 在衡量一个陷波器对伺服系统的影响时,重点关注的参数一般有三个: (1)陷波频率(单位HZ) (2)陷波深度(单位dB) (3)陷波宽度(单位HZ) 窄带陷波滤波器相对普通陷波器而言,陷波宽度很小,形象的比喻就是针对共振点精确抑制。同时能最大程度减小对伺服控制的影响。较为理想的陷波器应该具有较大的陷波深度,宽度较窄,同时相位偏移影响尽量小等。   一、60Hz带阻滤波器设计       二、窄带陷波滤波器BODE 为了实际应用考虑,配置可变参数使得陷波频率在1Khz~20Khz连续可调。当然,陷波器的可调范围应该覆盖伺服系统可能的共振点,否者应该通过修改陷波器参数使其可调。   三、PCBA(NotchfilterandHighfrequencedampinginside)   【xymotion@126.com】

相关推荐

推荐阅读