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错误)的解决相关推荐

  1. CORS跨域时axios无法获取服务器自定义的header信息 - 番外篇

    已解决CORS跨域时axios无法获取服务器自定义的header信息?! 先看代码: // 登录后的表单提交ajaxRegisterApi: function (form) { var key = l ...

  2. axios库读不到cookie_Vue axios 跨域请求无法带上cookie的解决

    Vue axios 跨域请求无法带上cookie的解决 在main.js设置 // 携带cookie axios.defaults.withCredentials = true 补充知识:VUE ax ...

  3. ajax error parsererror,完美解决ajax跨域请求下parsererror的错误

    AJAX 的 完美解决ajax跨域请求下parsererror的错误 ajax请求报parsererror错误是很宽泛的概念,很多情况下都报这个错, 在很多时候,即使ajax提交.返回都正常 XMLH ...

  4. 启动Jupyter Notebook时出现Kernel error错误的解决方法

    启动Jupyter Notebook时出现Kernel error错误的解决方法 方法如下: 1.打开Anaconda Prompt,然后输入jupyter kernelspec list,查看一下 ...

  5. win10系统远程连接时发生身份验证错误的解决方法

    win10系统远程连接时发生身份验证错误的解决方法 解决这个问题有2个方法,百度了很久找到的: 1.在当前提示错误的电脑上操作,运行输入gpedit.msc 进入[打开组策略,依次展开"计算 ...

  6. php服务器连接错误,运行PHP文件时出现内部服务器错误的解决方法

    运行PHP文件时出现内部服务器错误的解决方法 发布时间:2020-11-20 18:06:51 来源:亿速云 阅读:101 作者:Leah 这期内容当中小编将会给大家带来有关运行PHP文件时出现内部服 ...

  7. linux出现e325错误,用Vim编辑文件时出现E325: ATTENTION错误的解决方法

    用Vim编辑文件时出现E325: ATTENTION错误的解决方法 当用Vim编辑一个文件时出现下列错误 [root@zabbix ~]# vim /usr/local/msmtp/etc/msmtp ...

  8. JAVA解决OPTIONS请求问题:跨域时ajax发送两次请求,其中options预请求参数为null及其解决方案

    转载请注明出处 原文链接:https://blog.csdn.net/qq_39309348/article/details/103267908 在正式跨域的请求前,浏览器会根据需要,发起一个&quo ...

  9. ajax跨域时使得后台的sessionid不断地的变化,以及layui表格支持跨域的方法,java

    java+ajax跨域sessionid不断变化 由于实现一个功能,需要实现一个在过滤器中使用session的程序, 结果在前端使用ajax访问后台时,后台一直不能获取session存的值,导致了某一 ...

最新文章

  1. 独家 | 全面!手把手教你决策树可视化(附链接代码)
  2. 什么是微调?什么是模型迁移?
  3. ExtJS学习:MVC模式案例(一)
  4. [html] 一般习惯把js写在</body>前,但有例外的情况吗?说说看
  5. 使用nohup以守护进程方式启动程序
  6. 市场观察人士:有充足代工产能支持 联发科3月份营收有望创下新高
  7. 浅析ERP软件企业资源的关系与发展
  8. 数学建模算法与应用学习(一)
  9. keystore签名文件与platform.pk8、platform.x509.pem之间的相互转换
  10. 最棒的SpringCloud微服务后台管理系统
  11. 具有万有引力加速机理的布谷鸟搜索算法
  12. C++ malloc()的使用
  13. (MATLAB)绘制三维曲线(plot3/plot)
  14. Channel 用法
  15. 任天堂网站“要求的内容有误”解决方法
  16. 性能分析 -- 各种毛刺
  17. 和平精英电脑版服务器未响应,和平精英电脑版为什么卡顿 电脑版卡顿解决方法...
  18. 谈谈LTE 4G技术(by quqi99)
  19. 计算数组中N个数的平均值(均为正数),将小于平均值的数放到数组前部,大于等于平均值的数放到数组后部。
  20. 小米盒子刷鸿蒙系统,继续提升配置:小米 发布小米盒子3 增强版

热门文章

  1. 数据分析师刚入职第一月需要注意什么?
  2. 『程序员』 [业内动态]谈谈软件从业学习方向
  3. jira 切换 语言_jira中文语言包官方地址
  4. gt ge lt le ne eq 缩写 的 英文 含义
  5. Altium Designer PCB板中各层的作用
  6. matlab画奥迪标志,绘画汽车,用PS绘制一个逼真的奥迪汽车
  7. c语言编译是灰的,编译灰鸽子打造自己专用版C
  8. Unity2D游戏制作的基本流程
  9. ripro9.1(9.2)最新修正升级完美版,无加密无后门无需扩展
  10. python头像怎么弄_如何用 Python 把朋友头像变表情包?!!