1 2 3 4 5 6 7 8 |
// jQuery 示例: $.ajax({ crossDomain: true, xhrFields: { withCredentials: true }, url: 'http://other.domain/api.json' }); |
其中 crossDomain: true 属性,可禁止添加 X-Requested-With: XMLHttpRequest 自定义请求头。默认情况下,对于非跨域请求会添加,对于跨域请求不添加。
其中 withCredentials: true 属性,可控制 XMLHttpRequest 对象,携带 other.domain 域下的凭证信息(如 Cookie 等)。
对于简单请求,会直接发送指定类型的请求。对于预请求,会先发出一个 OPTIONS 请求,得到成功回应后才发送指定类型的请求。
1 2 3 4 5 |
// Java 示例: response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin") == null ? "*" : request.getHeader("Origin")); response.setHeader("Access-Control-Allow-Methods", request.getHeader("Access-Control-Request-Method")); response.setHeader("Access-Control-Allow-Headers", request.getHeader("Access-Control-Request-Headers")); response.setHeader("Access-Control-Allow-Credentials", "true"); |
根据前端提供的请求头,后端返回对应的响应头。对于 OPTIONS 请求,注意不要执行业务代码。
对于前端未授权的同步(如访问 html 页面)请求,后端可直接 302 跳转至登录页。对于前端未授权的异步(如 json 接口)请求,后端应仍然输出 json 结构响应,可在该结构中定义代表需要登录的状态码。
对于异步请求的检查,建议使用请求后缀(如 json 后缀)检查。不建议使用请求头(如 X-Requested-With 自定义头)检查,因为对于预请求,是不会携带该自定义头的。