cors解决跨域问题笔记-1

在公司项目中解决了各种类型的跨域, 由于项目页面嵌套了相同域名但是端口号不同的iframe页面, 所以存在了iframe之间的跨域问题, 这种直接在页面上通过

document.domain = 'test.com'

来设置相同的超级域名来解决问题 (注意: 1.iframe页面和嵌套iframe的父页面都需要设置这段代码 2. 两个域之间只能是端口号不同的情况下才能生效) 


 

今天记录的主要是通过ajax请求所出现的跨域问题, 解决方案有很多种, 最主流的是通过CORS的解决方案来解决.

以前端jquery库 + 后端java代码为例:

前端发起ajax请求:

$.ajax({
        type: 'GET',
        url: url,
        xhrFields: {
            withCredentials: true   // Request header中便会带上 Cookie 信息
        },
        crossDomain: true
    })

后端java设置自定义响应头

//设置可以跨域
String orgin = request.getHeader("Origin");
response.setHeader("Access-Control-Allow-Headers","DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,key,x-biz,x-info,platinfo,encr,enginever,gzipped,poiid"); response.setHeader("Access-Control-Allow-Origin", orgin); response.setHeader("Access-Control-Allow-Methods","*"); response.setHeader("Access-Control-Allow-Credentials", "true");

注意: 若要在请求中附送cookie的信息 前端代码中 withCredentials: true 和后端 response.setHeader("Access-Control-Allow-Credentials", "true") 这两段代码不能少   (XMLHttpRequest.withCredentials)

如果不设置 前端发送的ajax请求(跨域的情况下)中将不会携带cookie的字段, 后端也就不能通过cookie来获取相应的信息

(若后端不需要获取cookie等客户端状态证件类的信息, 就不需要设置 Credentials)

当设置了

response.setHeader("Access-Control-Allow-Credentials", "true");
"Access-Control-Allow-Origin" 字段就不能设置为 "*", 需要动态地去获取客户端的orgin
String orgin = request.getHeader("Origin");
response.setHeader("Access-Control-Allow-Origin", orgin);

 

这样 通过ajax发送带有cookie的请求的跨域问题就解决了

posted @ 2018-11-09 13:36  allen2001  阅读(169)  评论(0编辑  收藏  举报