什么是跨域问题:
当浏览器请求的域名、端口号与ajax请求的域名、端口号不同的时候,由于浏览器的安全机制,就会出现可以访问接口但是获取不到结果的问题,这就是跨域问题
跨域问题的解决方案:
使用jsonp解决跨域问题:不推荐,因为只能处理get请求;
使用HttpClient进行转发:不推荐,因为效率比较低,会发送两次请求;
设置相应头允许跨域:可以推荐,适合小公司快速解决问题;(CrossOrigin)
使用Nginx搭建API接口网关:强烈推荐,因为保证域名和端口号都一致,以项目区分反向代理到真实的服务器地址;
使用Zuul微服务搭建API网关接口:强烈推荐,SpringCloud Zuul搭建属于java微服务模块 注册中心 网关服务 a项目 b项目
微服务之间的通讯会产生跨域问题吗?不会,因为rpc之间的通讯走的是后端访问,与浏览器无关;



如果某个文件存在跨域,当访问这个文件的时候nginx已经解决了跨域,但是前端某些插件依然会报跨域问题,则可以应用下边这种方式解决
import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import javax.servlet.http.HttpServletResponse;import org.apache.http.HttpResponse;import org.apache.http.client.methods.HttpRequestBase;import org.apache.http.util.EntityUtils;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestParam;import com.yunshicloud.basicModule.utils.util.HttpUtil;@Controllerpublic class DownloadController {@RequestMapping(value= {"/api/download","/api/download/"})public void download(@RequestParam String url, HttpServletResponse response) {byte[] b = new byte[1024 * 1024];OutputStream outputStream = null;InputStream inputStream = null;HttpRequestBase httpRequest = null;HttpResponse httpResponse = null;try {outputStream = response.getOutputStream();httpRequest = HttpUtil.getGetRequest(url, null, null, Integer.MAX_VALUE);httpResponse = HttpUtil.executeRequestGetResponse(httpRequest);inputStream = httpResponse.getEntity().getContent();org.apache.http.Header[] headers = httpResponse.getAllHeaders();if(null != headers) {for(org.apache.http.Header header:headers) {response.addHeader(header.getName(), header.getValue());}}int readLen = 0;while(-1 != (readLen = inputStream.read(b))) {outputStream.write(b, 0, readLen);}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();} finally {if(null != httpResponse) {EntityUtils.consumeQuietly(httpResponse.getEntity());}if(null != httpRequest) {httpRequest.releaseConnection();}if(null != outputStream) {try {outputStream.flush();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}try {outputStream.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}}
