什么是跨域问题:
    当浏览器请求的域名、端口号与ajax请求的域名、端口号不同的时候,由于浏览器的安全机制,就会出现可以访问接口但是获取不到结果的问题,这就是跨域问题

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

    分布式解决方案_02.docx 上课代码.zip

    什么是跨域问题.png

    跨域问题演示.png

    跨域问题解决方案.png

    如果某个文件存在跨域,当访问这个文件的时候nginx已经解决了跨域,但是前端某些插件依然会报跨域问题,则可以应用下边这种方式解决

    1. import java.io.IOException;
    2. import java.io.InputStream;
    3. import java.io.OutputStream;
    4. import javax.servlet.http.HttpServletResponse;
    5. import org.apache.http.HttpResponse;
    6. import org.apache.http.client.methods.HttpRequestBase;
    7. import org.apache.http.util.EntityUtils;
    8. import org.springframework.stereotype.Controller;
    9. import org.springframework.web.bind.annotation.RequestMapping;
    10. import org.springframework.web.bind.annotation.RequestParam;
    11. import com.yunshicloud.basicModule.utils.util.HttpUtil;
    12. @Controller
    13. public class DownloadController {
    14. @RequestMapping(value= {"/api/download","/api/download/"})
    15. public void download(@RequestParam String url, HttpServletResponse response) {
    16. byte[] b = new byte[1024 * 1024];
    17. OutputStream outputStream = null;
    18. InputStream inputStream = null;
    19. HttpRequestBase httpRequest = null;
    20. HttpResponse httpResponse = null;
    21. try {
    22. outputStream = response.getOutputStream();
    23. httpRequest = HttpUtil.getGetRequest(url, null, null, Integer.MAX_VALUE);
    24. httpResponse = HttpUtil.executeRequestGetResponse(httpRequest);
    25. inputStream = httpResponse.getEntity().getContent();
    26. org.apache.http.Header[] headers = httpResponse.getAllHeaders();
    27. if(null != headers) {
    28. for(org.apache.http.Header header:headers) {
    29. response.addHeader(header.getName(), header.getValue());
    30. }
    31. }
    32. int readLen = 0;
    33. while(-1 != (readLen = inputStream.read(b))) {
    34. outputStream.write(b, 0, readLen);
    35. }
    36. } catch (IOException e) {
    37. // TODO Auto-generated catch block
    38. e.printStackTrace();
    39. } catch (Exception e) {
    40. // TODO Auto-generated catch block
    41. e.printStackTrace();
    42. } finally {
    43. if(null != httpResponse) {
    44. EntityUtils.consumeQuietly(httpResponse.getEntity());
    45. }
    46. if(null != httpRequest) {
    47. httpRequest.releaseConnection();
    48. }
    49. if(null != outputStream) {
    50. try {
    51. outputStream.flush();
    52. } catch (IOException e) {
    53. // TODO Auto-generated catch block
    54. e.printStackTrace();
    55. }
    56. try {
    57. outputStream.close();
    58. } catch (IOException e) {
    59. // TODO Auto-generated catch block
    60. e.printStackTrace();
    61. }
    62. }
    63. }
    64. }
    65. }