五种跨域网站请求解决办法

1.什么是跨域?

就是浏览器安全机制,请求访问的域名与ajax请求的域名不一致,导致无法返回结果.

浏览器机制问题,并不是安全问题.这只是在ajax请求中出现的问题,浏览器默人请求资源必须在同一个域名下面.

2.跨域问题如何解决?

2.1 jsonp 但是只支持get请求不支持post请求

原理:使用script发送get请求,将一个参数传过去,然后回调的时候在带回来进行解析.

五种跨域网站请求解决办法_第1张图片

那么如何使用jsonp呢?

2.1.1 在ajax里面将datatype修改为jsonp 然后加入jsonp的一个参数,这个参数的值需要和后端获取的值一样

五种跨域网站请求解决办法_第2张图片

2.1.2 在后端获取到前段加入的值,然后在将此值返回给前段

五种跨域网站请求解决办法_第3张图片

2.1.3 前段获取到此值

五种跨域网站请求解决办法_第4张图片

一定要记住jsonp的缺点,只能发送get请求,不能发送post请求

我们做一下测试,将json的修改为post请求,然后在浏览器的控制台发现,仍然是脚本类型

五种跨域网站请求解决办法_第5张图片


2.2 使用httpclient进行转发

优点:安全

缺点:两次请求效率低下,代码重复

实现步骤,
1.ajax请求地址还是请求本项目的地址
2.在本项目中我们接受该请求

3.在后端我们使用httpclient进行转发

4.转发之后我们在将获取到请求通过response返回到前段页面


转发的核心代码

@WebServlet("/getServlet")
public class ServletTest extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        /**
         * 创建请求
         */
        CloseableHttpClient aDefault = HttpClients.createDefault();
        /**
         * 创建get请求
         */
        HttpGet httpGet = new HttpGet("http://127.0.0.1/app.ZMTManage/?m=zmtmanage&c=index&a=init");
        /**
         * 执行请求
         */
        CloseableHttpResponse execute = aDefault.execute(httpGet);
        /**
         * 获取状态
         */
        int statusCode = execute.getStatusLine().getStatusCode();
        if (200==statusCode){
            /**
             * 解析请求头
             */
            String entity = EntityUtils.toString(execute.getEntity());
            /**
             * 写入response
             */
            resp.getWriter().print(entity);
            /**
             * 关闭请求
             */
            execute.close();
            aDefault.close();

        }
    }
}

2.3 添加请求头header ,允许访问  

这个是最简单的,小项目一般会使用这个,大项目不会使用

五种跨域网站请求解决办法_第6张图片

2.4 使用接口网关 nginx搭建api网关 

什么叫做网关:拦截所有的请求,并进行分发

五种跨域网站请求解决办法_第7张图片

配置:

server {

        listen       80;

        server_name  lizhen.com;

        location /A {

                       proxy_pass  http://a.a.com:81/A;

                            index  index.html index.htm;

        }

                   location /B {

                       proxy_pass  http://b.b.com:81/B;

                            index  index.html index.htm;

        }

    }

我之前的一篇文章写过如何通过Nginx进行区分项目然后转发,大家可以看一下解决方案.  Nginx+tomcat 实现负载均衡 

2.5使用 spring cloud zull 搭建网关

你可能感兴趣的:(java,http)