我们在处理后台接口跟前端页面衔接的时候,经常会出现跨域问题,今天特意抽时间收集整理了些方案,分享出来,希望能够帮助到大家。
一、跨域与同源策略
跨域,通俗地讲,是指一个服务A的客户端请求另一个服务B的数据。下面给出了跨域的图示。
在上面这个图中,描述了客户端与服务A关系,也就是说,客户端不允许对服务A以外的服务进行访问。这就是典型的跨域问题。通常同源策略与跨域紧密联系在一起。同源策略,它是由Netscape提出的一个著名的安全策略。现在所有支持JavaScript 的浏览器都会使用这个策略。所谓同源是指,域名,协议,端口相同。当一个浏览器的两个tab页中分别打开来 百度和谷歌的页面。当浏览器的百度tab页执行一个脚本的时候会检查这个脚本是属于哪个页面的,即检查是否同源,只有和百度同源的脚本才会被执行。如果非同源,那么在请求数据时,浏览器会在控制台中报一个异常,提示拒绝访问。通常这个异常以下面的形式存在着:
二、跨域的情况
我们需要了解跨域的一些情况,一起来看张图:
三、ajax接口数据类型:json与jsonp
1、json格式:
{ "message":"获取成功", "state":"1", "result":{"name":"工作组1","id":1,"description":"11"} }
2、jsonp格式:
callback({ “message”:“获取成功”, “state”:“1”, “result”:{“name”:“工作组1”,“id”:1,“description”:“11”} })
看出来区别了吧,在url中callback传到后台的参数是神马callback就是神马,jsonp比json外面有多了一层,callback()。这样就知道怎么处理它了。于是修改后台代码。
Jsonp(JSON with Padding) 是 json 的一种"使用模式",可以让网页从别的域名(网站)那获取资料,即跨域读取数据。注意:Jsonp只支持get请求。四、跨域处理代码实现
1、ajax的Jsonp方式
(1)前端代码
$(document).ready(function(){ var url=“xxx.com/data”; $.ajax({ url:url, dataType:‘jsonp’, jsonp:“callback”, //Jquery生成验证参数的名称 processData: false, type:‘get’, success:function(data){ console.info(data); }, error:function(XMLHttpRequest, textStatus, errorThrown) { alert(XMLHttpRequest.status); alert(XMLHttpRequest.readyState); alert(textStatus); } }); });
(2)后台代码
@ResponseBody @RequestMapping(value = “/listUserInfos.action”) public String listUserInfos(@RequestParam(“callback”) String callback) throws Exception { UserInfo user = new UserInfo(); user.setUserName(“yzh”); user.setPassword(“123”); return callback+"("+JSONObject.toJSONString(user)+")"; }
说明:在这个接口中,使用了RequestParam 注解接收callback 参数,我们在客户端请求中可以注意到callback 的内容:http://xxx.com/data?callback=jsonp1541555710866
2、nginx的反向代理解决跨域问题
第一步:Tomcat集群配置
server { listen 8088; server_name 192.168.154.4 yzh.com.cn; #location / { # root D:\software_package\nginx-1.7.7\html; # root E:/hphg/tempFile; # index index.html index.htm; #} error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } location /yx-web/ { proxy_pass http://xxx.com:8080/yx-web/; } location /yx-web2/ { proxy_pass http://xxx.com:8080/yx-web/; } location /test/ { proxy_pass http://xxx.com:8080/test/; } location /test2/ { proxy_pass http://192.168.154.4:8082/test/; } location /test3/ { proxy_pass http://192.168.154.4:8083/test/; } #引入js静态资源 location ~ \.(js)$ { root D:/nginx_static_resources/test/js; } #引入css静态资源 location ~ \.(css)$ { root D:/nginx_static_resources/test/css; } }
第二步:编写jsp文件
<%@ page language=“java” contentType=“text/html; charset=utf-8” pageEncoding=“utf-8”%> <span>hello world!</span>
说明:url需要写成反向代理中的代理地址,这是nginx能解决跨域问题的原因。
第三步:编写contoller类
@ResponseBody @RequestMapping(value = “/listUserInfos2.action”) public UserInfo listUserInfos2() throws Exception { UserInfo user = new UserInfo(); user.setUserName(“yzh2”); user.setPassword(“123”); return user; }
第四步:测试
在浏览器的地址栏中输入http://xxx.com:8088/test2/index.jsp,即可看到浏览器的控制台打印的用户信息,说明跨域获取数据成功。
网友评论文明上网理性发言 已有2人参与
发表评论:
评论列表