什么是跨域问题:
当浏览器请求的域名、端口号与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;
@Controller
public 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 block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.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 block
e.printStackTrace();
}
try {
outputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}