同基础域名下的不同二级域名的工程之间的数据跨域交互问题

废话不多说,说明问题:

 

 如下图所示,在做评论上传图片功能时遇到一个问题,我们所有的PC上传控件统一使用的是ajaxfileupload.js,它是一个非常简单轻便的web上传控件,松耦合性,搞灵活性,如了解去百度查,用了就知道。我们的上传图片的公有类也是照搬其他工程的公有类,代码如下:

写道
import java.io.ByteArrayOutputStream;
import java.io.InputStream;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.util.MultiValueMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;

import com.alibaba.fastjson.JSON;
import com.tangniuw.common.controller.BaseController;
import com.tangniuw.common.fastjson.SerializerFeatureUtil;
import com.tangniuw.model.aliyun.PictureResponse;
import com.tangniuw.service.aliyun.PictureUploadService;

/**
* 图片上传公共Controller
*
*
*
*/
@Controller
public class ImageUploadController extends BaseController {

@Autowired
private PictureUploadService pictureUploadService;

/**
* 图片上传公共方法
*
* @param request
* @param response
* @return
* @throws Exception
*/
@ResponseBody
@RequestMapping(value = "/common/uploadImage")
public String uploadImages(HttpServletRequest request, HttpServletResponse response) throws Exception {
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
MultipartFile file = multipartRequest.getFile("file-image");
MultiValueMap<String, MultipartFile> map = multipartRequest.getMultiFileMap();
for (String key : map.keySet()) {
if (StringUtils.isNotBlank(key)) {
file = multipartRequest.getFile(key);
break;
}
}
String imageType = StringUtils.substringAfter(file.getContentType(), "/");
InputStream is = file.getInputStream();
ByteArrayOutputStream swapStream = new ByteArrayOutputStream();
byte[] buff = new byte[100];
int rc = 0;
while ((rc = is.read(buff, 0, 100)) > 0) {
swapStream.write(buff, 0, rc);
}
byte[] imageByte = swapStream.toByteArray();
PictureResponse pictureResponse = pictureUploadService.uploadByImageByte(imageType, true, imageByte);
return JSON.toJSONString(pictureResponse, SerializerFeatureUtil.features);
}


}

同基础域名下的不同二级域名的工程之间的数据跨域交互问题

 

 然后西西来了。console竟然报跨域?!。。。哭笑不得。其他工程用的好好地这里跨域了?

同基础域名下的不同二级域名的工程之间的数据跨域交互问题

然后我去检查了一下JS代码,发现有一个西西:

写道
document.domain=xxx;

 java代码中有:

写道
String url = PropertiesUtil.getConfValueByProperties("xxx.domain");
modelMap.put("url", url);

 找到问题所在了,就是以前在做这个评价功能时wap端与PC端需要进行部分交互,于是就有了跨域访问的问题:

写道
基于iframe实现的跨域要求两个域具有aa.xx.com,bb.xx.com这种特点,也就是两个页面必须属于一个基础域(例如都是xxx.com,或是xxx.com.cn),使用同一协议(例如都是 http)和同一端口(例如都是80),这样在两个页面中同时添加document.domain,就可以实现父页面调用子页面的函数,代码如下:
页面一:
<html>
<head>
<script>
document.domain = "xx.com";
function aa(){
alert("p");
}
</script>
</head>
<body>
<iframe src="http://localhost:8080/CmsUI/2.html" id="i">

</iframe>
<script>
document.getElementById('i').onload = function(){
var d = document.getElementById('i').contentWindow;
d.a();

};
</script>
</body>
</html>

 然后本人去两个工程在console中调用尝试了一下,不过两个工程的domain必须一致,然后果然可以访问。

 

不过这种跨域的方法必须是同基础域名下才能用