CROS实现跨域时授权问题(401错误)的解决
http://www.open-open.com/lib/view/open1463878276539.html
如果我们访问的资源是不需要授权的,也就是在HTTP请求头中不包含 authentication 头那么以上做法就足够了。但是如果该资源是需要权限验证的,那么这个时候跨域请求的预检测 option 请求,由于不会携带身份信息而被拒绝 。浏览器会报出401错误。
前几天的文章 Spring通过CROS协议解决跨域问题 中提到了如何解决跨域问题的基本思路,解决了跨域请求时浏览器403错误。
Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access. The response had HTTP status code 403
401错误信息如下:
Failed to load resource: the server responded with a status of 401 (Unauthorized) XMLHttpRequest cannot load http://localhost/api/test. Response for preflight has invalid HTTP status code 401
既然知道了问题的原因,答案也就很容易得出: 对需要进行跨域请求的资源(api),当服务端检测到是 OPTONS 请求时候统统放行,给出HTTP.OK(200)的状态和必要的响应头,哪怕它是不带身份信息的 。
这个问题既可以通过编写对应的后端代码实现,也可以通过设置服务器配置文件实现。也就是如何设置响应头和返回200状态码的办法了。
Spring+Shrio的解决方案
shiro中可以在自己实现的身份验证filter中加入以下代码:
@Overrideprotected boolean preHandle(ServletRequest servletRequest, ServletResponse servletResponse) throws Exception {HttpServletRequest request = (HttpServletRequest) servletRequest;HttpServletResponse response = (HttpServletResponse) servletResponse;if(request.getMethod().equals(RequestMethod.OPTIONS.name())){response.setStatus(HttpStatus.OK.value());return false;}return super.preHandle(request, response);}
shiro中AccessControlFilter提供了访问控制的基础功能;比如是否允许访问/当访问拒绝时如何处理等,也是我们一般自定义权限验证时候的一个父类,我们通过重写他的 onPreHandle 方法判断是否是 option 请求,如果是则设置相应状态,(响应头已经在之前文章中通过filter配置过了)返回false表示该拦截器实例已经处理了,将直接返回即可。
Tomcat配置
需要修改tomcat的全局web.xml文件在 CATALINA_HOME/conf 下,加入以下配置。
<filter><filter-name>CorsFilter</filter-name><filter-class>org.apache.catalina.filters.CorsFilter</filter-class></filter><filter-mapping><filter-name>CorsFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>
Nginx配置
add_header 'Access-Control-Allow-Methods' 'GET,OPTIONS,PUT,DELETE' always; add_header 'Access-Control-Allow-Credentials' 'true' always; add_header 'Access-Control-Allow-Origin' '$http_origin' always; add_header 'Access-Control-Allow-Headers' 'Authorization,DNT,User-Agent,Keep-Alive,Content-Type,accept,origin,X-Requested-With' always;if ($request_method = OPTIONS ) {return 200; }
Apache配置
Header always set Access-Control-Allow-Origin "http://waffle" Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS" Header always set Access-Control-Allow-Credentials "true" Header always set Access-Control-Allow-Headers "Authorization,DNT,User-Agent,Keep-Alive,Content-Type,accept,origin,X-Requested-With"RewriteCond %{REQUEST_METHOD} OPTIONS RewriteRule ^(.*)$ $1 [R=200,L]
js请求示例
请求时候需要加上 Authorization 和 Content-Type 头。
$http({method: 'POST',url: scope.webdav.url,withCredentials: true,headers: {Authorization: 'Basic ' + btoa(user + ':' + password),'Content-Type': 'application/vnd.google-earth.kml+xml; charset=utf-8'},data: getKml() })
CROS实现跨域时授权问题(401错误)的解决相关推荐
- CORS跨域时axios无法获取服务器自定义的header信息 - 番外篇
已解决CORS跨域时axios无法获取服务器自定义的header信息?! 先看代码: // 登录后的表单提交ajaxRegisterApi: function (form) { var key = l ...
- axios库读不到cookie_Vue axios 跨域请求无法带上cookie的解决
Vue axios 跨域请求无法带上cookie的解决 在main.js设置 // 携带cookie axios.defaults.withCredentials = true 补充知识:VUE ax ...
- ajax error parsererror,完美解决ajax跨域请求下parsererror的错误
AJAX 的 完美解决ajax跨域请求下parsererror的错误 ajax请求报parsererror错误是很宽泛的概念,很多情况下都报这个错, 在很多时候,即使ajax提交.返回都正常 XMLH ...
- 启动Jupyter Notebook时出现Kernel error错误的解决方法
启动Jupyter Notebook时出现Kernel error错误的解决方法 方法如下: 1.打开Anaconda Prompt,然后输入jupyter kernelspec list,查看一下 ...
- win10系统远程连接时发生身份验证错误的解决方法
win10系统远程连接时发生身份验证错误的解决方法 解决这个问题有2个方法,百度了很久找到的: 1.在当前提示错误的电脑上操作,运行输入gpedit.msc 进入[打开组策略,依次展开"计算 ...
- php服务器连接错误,运行PHP文件时出现内部服务器错误的解决方法
运行PHP文件时出现内部服务器错误的解决方法 发布时间:2020-11-20 18:06:51 来源:亿速云 阅读:101 作者:Leah 这期内容当中小编将会给大家带来有关运行PHP文件时出现内部服 ...
- linux出现e325错误,用Vim编辑文件时出现E325: ATTENTION错误的解决方法
用Vim编辑文件时出现E325: ATTENTION错误的解决方法 当用Vim编辑一个文件时出现下列错误 [root@zabbix ~]# vim /usr/local/msmtp/etc/msmtp ...
- JAVA解决OPTIONS请求问题:跨域时ajax发送两次请求,其中options预请求参数为null及其解决方案
转载请注明出处 原文链接:https://blog.csdn.net/qq_39309348/article/details/103267908 在正式跨域的请求前,浏览器会根据需要,发起一个&quo ...
- ajax跨域时使得后台的sessionid不断地的变化,以及layui表格支持跨域的方法,java
java+ajax跨域sessionid不断变化 由于实现一个功能,需要实现一个在过滤器中使用session的程序, 结果在前端使用ajax访问后台时,后台一直不能获取session存的值,导致了某一 ...
最新文章
- 独家 | 全面!手把手教你决策树可视化(附链接代码)
- 什么是微调?什么是模型迁移?
- ExtJS学习:MVC模式案例(一)
- [html] 一般习惯把js写在</body>前,但有例外的情况吗?说说看
- 使用nohup以守护进程方式启动程序
- 市场观察人士:有充足代工产能支持 联发科3月份营收有望创下新高
- 浅析ERP软件企业资源的关系与发展
- 数学建模算法与应用学习(一)
- keystore签名文件与platform.pk8、platform.x509.pem之间的相互转换
- 最棒的SpringCloud微服务后台管理系统
- 具有万有引力加速机理的布谷鸟搜索算法
- C++ malloc()的使用
- (MATLAB)绘制三维曲线(plot3/plot)
- Channel 用法
- 任天堂网站“要求的内容有误”解决方法
- 性能分析 -- 各种毛刺
- 和平精英电脑版服务器未响应,和平精英电脑版为什么卡顿 电脑版卡顿解决方法...
- 谈谈LTE 4G技术(by quqi99)
- 计算数组中N个数的平均值(均为正数),将小于平均值的数放到数组前部,大于等于平均值的数放到数组后部。
- 小米盒子刷鸿蒙系统,继续提升配置:小米 发布小米盒子3 增强版
热门文章
- 数据分析师刚入职第一月需要注意什么?
- 『程序员』 [业内动态]谈谈软件从业学习方向
- jira 切换 语言_jira中文语言包官方地址
- gt ge lt le ne eq 缩写 的 英文 含义
- Altium Designer PCB板中各层的作用
- matlab画奥迪标志,绘画汽车,用PS绘制一个逼真的奥迪汽车
- c语言编译是灰的,编译灰鸽子打造自己专用版C
- Unity2D游戏制作的基本流程
- ripro9.1(9.2)最新修正升级完美版,无加密无后门无需扩展
- python头像怎么弄_如何用 Python 把朋友头像变表情包?!!