1.什么是跨域?
就是浏览器安全机制,请求访问的域名与ajax请求的域名不一致,导致无法返回结果.
浏览器机制问题,并不是安全问题.这只是在ajax请求中出现的问题,浏览器默人请求资源必须在同一个域名下面.
2.跨域问题如何解决?
2.1 jsonp 但是只支持get请求不支持post请求
原理:使用script发送get请求,将一个参数传过去,然后回调的时候在带回来进行解析.
那么如何使用jsonp呢?
2.1.1 在ajax里面将datatype修改为jsonp 然后加入jsonp的一个参数,这个参数的值需要和后端获取的值一样
2.1.2 在后端获取到前段加入的值,然后在将此值返回给前段
2.1.3 前段获取到此值
一定要记住jsonp的缺点,只能发送get请求,不能发送post请求
我们做一下测试,将json的修改为post请求,然后在浏览器的控制台发现,仍然是脚本类型
2.2 使用httpclient进行转发
缺点:两次请求效率低下,代码重复
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 ,允许访问
这个是最简单的,小项目一般会使用这个,大项目不会使用
2.4 使用接口网关 nginx搭建api网关
什么叫做网关:拦截所有的请求,并进行分发
配置:
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 实现负载均衡