同源策略限制:
同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果没有同源策略,攻击者可以通过JavaScript获取你的邮件以及其他敏感信息,比如说阅读私密邮件,发送虚假邮件,查看聊天记录等等。
所谓同源是指,协议,域名,端口相同。三者只有有一个不相同,就认为不同源!
解决方式一(jsonp):
1.服务端:
/** * 我的假期 */ public String getApplyLeaveCount(){ resultJSON.clear(); try { String result = getRequest().getParameter("callback") + "({'annualLeave':'36','exchangeLeave':'12','code':0})"; getResponse().getWriter().print(result); getResponse().getWriter().close(); }catch (Exception e){ e.printStackTrace(); } return SUCCESS; }
2.客户端:
$.ajax({ async: false, url: "http://192.168.2.30:8080/attendanceClient/manager/applyLeave/getApplyLeaveCount.action", type: "GET", dataType: 'jsonp',//一种非官方跨域数据交互协议 //要传递的参数,没有传参时,也一定要写上 data: null, timeout: 5000, //返回Json类型 contentType: "application/json;utf-8", //服务器段返回的对象包含name,data属性. success: function (result) { $('#annualLeave').html(result.annualLeave); $('#exchangeLeave').html(result.exchangeLeave); } });请求后台时的路径:
返回值:
解决方式二(CORS):
设置Response Headers:
response.setContentType("text/html;charset=UTF-8"); response.setHeader("Access-Control-Allow-Origin", "*");//指定允许其他域名访问,必须设置 response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");//响应类型 response.setHeader("Access-Control-Allow-Headers", "Origin, No-Cache, X-Requested-With, If-Modified-Since, " + "Pragma, Last-Modified, Cache-Control, Expires, Content-Type, X-E4M-With,userId,token");//响应头设置
JSONP和CORS对比:
1.JSONP只能实现GET请求,而CORS支持所有类型的HTTP请求。
2.使用CORS,开发者可以使用普通的XMLHttpRequest发起请求和获得数据,比起JSONP有更好的错误处理。
3.JSONP主要被老的浏览器支持,它们往往不支持CORS,而绝大多数现代浏览器都已经支持了CORS。
2.使用CORS,开发者可以使用普通的XMLHttpRequest发起请求和获得数据,比起JSONP有更好的错误处理。
3.JSONP主要被老的浏览器支持,它们往往不支持CORS,而绝大多数现代浏览器都已经支持了CORS。