1- ##CROS实现跨域时授权问题
1+ ## CROS实现跨域时授权问题
22
33 Response to preflight request doesn't pass access control check:
44 No 'Access-Control-Allow-Origin' header is present on the requested resource.
55 Origin 'null' is therefore not allowed access. The response had HTTP status code 403
66
7- ###问题的提出
7+ ### 问题的提出
88如果我们访问的资源是不需要授权的,也就是在HTTP请求头中不包含authentication头那么以上做法就足够了。但是如果该资源是需要权限验证的,那么这个时候跨域请求的预检测option请求,由于不会携带身份信息而被拒绝。浏览器会报出401错误。错误信息如下:
99
1010 Failed to load resource:
1515既然知道了问题的原因,答案也就很容易得出:对需要进行跨域请求的资源(api),当服务端检测到是OPTONS请求时候统统放行,给出HTTP.OK(200)的状态和必要的响应头,哪怕它是不带身份信息的。
1616这个问题既可以通过编写对应的后端代码实现,也可以通过设置服务器配置文件实现。也就是如何设置响应头和返回200状态码的办法了。
1717
18- ###Spring+Shrio的解决方案
18+ ### Spring+Shrio的解决方案
1919shiro中可以在自己实现的身份验证filter中加入以下代码:
2020
2121``` Java
@@ -24,7 +24,7 @@ shiro中可以在自己实现的身份验证filter中加入以下代码:
2424
2525shiro中AccessControlFilter提供了访问控制的基础功能;比如是否允许访问/当访问拒绝时如何处理等,也是我们一般自定义权限验证时候的一个父类,我们通过重写他的onPreHandle方法判断是否是option请求,如果是则设置相应状态,(响应头已经在之前文章中通过filter配置过了)返回false表示该拦截器实例已经处理了,将直接返回即可。
2626
27- ###Tomcat配置
27+ ### Tomcat配置
2828需要修改tomcat的全局web.xml文件在CATALINA_HOME/conf下,加入以下配置。
2929
3030``` Xml
@@ -38,7 +38,7 @@ shiro中AccessControlFilter提供了访问控制的基础功能;比如是否
3838</filter-mapping >
3939```
4040
41- ###Nginx配置
41+ ### Nginx配置
4242
4343 add_header 'Access-Control-Allow-Methods' 'GET,OPTIONS,PUT,DELETE' always;
4444 add_header 'Access-Control-Allow-Credentials' 'true' always;
@@ -50,7 +50,7 @@ shiro中AccessControlFilter提供了访问控制的基础功能;比如是否
5050 return 200;
5151 }
5252
53- ###Apache配置
53+ ### Apache配置
5454
5555 Header always set Access-Control-Allow-Origin "http://waffle"
5656 Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS"
@@ -60,7 +60,7 @@ shiro中AccessControlFilter提供了访问控制的基础功能;比如是否
6060 RewriteCond %{REQUEST_METHOD} OPTIONS
6161 RewriteRule ^(.*)$ $1 [R=200,L]
6262
63- ###js请求示例
63+ ### js请求示例
6464请求时候需要加上Authorization和Content-Type头。
6565
6666 $http({
0 commit comments