1,java版
在某个接口的action里设置header的方法行不通,(猜测)因为跨域了之后就进入不到这块代码。
需要在更在之前,介入
比如:在
HandlerInterceptorAdapter
子类里
preHandle
方法加入:
private void filter (HttpServletRequest request, HttpServletResponse response) {
String origin = request.getHeader("Origin");
List<String> domains = Arrays.asList("http://10.96.113.56:3070",
"http://lps-test.intra.xiaojukeji.com",
"https://10.96.113.56:3070",
);
if(origin != null && domains.contains(origin)){
response.setHeader("Access-Control-Allow-Origin", origin);
}
log.info("CorsHelper-doFilter-origin:{}",origin );
// * 不行
// response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Headers", "x-requested-with,Authorization");
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS");
response.setHeader("Access-Control-Allow-Credentials", "true");
}
注意的是:response.setHeader("Access-Control-Allow-Origin", "*"); 这个不行,不知道为啥。
如此一来,交互流程是:
浏览器先发OPTIONS类型的请求,服务端返回200,内容为空。然后浏览器再发GET请求,浏览器返回正常数据。
2,php版
可以在接口action里显式调用
public static function allowChengYeCors()
{
$allowOrigin = array(
'http://10.96.113.56:3070',
'http://lps-test.intra.xiaojukeji.com',
'https://10.96.113.56:3070',
);
//跨域访问的时候才会存在此字段
$origin = isset($_SERVER['HTTP_ORIGIN']) ? $_SERVER['HTTP_ORIGIN'] : '';
if (in_array($origin, $allowOrigin)) {
header('Access-Control-Allow-Origin: '.$origin); //上线前改为对指定域开放
}
header('Access-Control-Allow-Credentials: true');
header('Access-Control-Allow-Headers:x-requested-with');
header('Access-Control-Allow-Methods: GET, POST, OPTIONS');
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。