跨域的系统。
单域的话直接写入cookie就可以,多域的话要求跨域管理。
---01---
跨域读写cookie:
代码:
域名的解析就是将域名的ip地址找到的过程。
1.先在本机找,就是host文件
ip是一样的,但是对于浏览器也是跨域了。
2.在网络DNS找,DNS服务器负责域名和ip地址的查找。
地址:
http://www.a.com/cross_cookie/cross_cookie_set.jsp
http://www.b.com/cross_cookie/cookie_reader.jsp
同源策略,注意一点,cookie.setDomn只能在同源之下设置的不同的子域,这个只是域得作用级别,不能随便写,你不能写入百度里面去。
---
如何跨域读写cookie呢?
代码:
演示:
流程是这样的,首先是向a域发起请求,将jsp界面加载回来,加载回来之后呢,逐行扫描,扫描到script标签就开始向b域发起请求。
再次访问b域就发现这个cookie了。
返回的这个cookie只能是b域才可以访问的。
看下controller的代码:
验证下:
---
在ie下再执行一次。
第二种:p3p协议,可以突破浏览器的第三方的访问协议的。
a域向b域写入cookie,b域服务端会告诉浏览器,我这个第三次方的隐私访问是不是允许的。
再次实验这次是成功的,第一次请求:
看到这个头就是可以写入的。
此时在b域,因为从a域写b域或者读b域是有第三方隐私的。
改进:
---
跨域写cookie就是把token值分享给其它的域。
第三种策略:
也就是重定向是可以跨域的。
代码:
我们看下前端的代码:
通过302进行网络的跳转,跳到b域。
访问:
不足:只能分享给另外的一个域名。
---
跨域的读取cookie:
我们给b域写入了一个111的token。
在a域上执行方法,读取b域的值:
---02---
跨域的ajax请求:
代码:
package demo.sso.web;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 示例性的,以json形式返回用户信息的servlet
*/
@WebServlet("/user_info")
public class GetUserInfoServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* 非简单请求,如 POST类型请求,或请求中有其它自定义Header,会执行一次preflight操作,浏览器会发起一次OPTIONS类型请求<br>
* 要对OPTIONS请求给予正确应答
*/
@Override
protected void doOptions(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
System.out.println("OPTIONS");
response.addHeader("Access-Control-Allow-Origin", "*");
response.addHeader("Access-Control-Allow-Methods",
"GET, POST, OPTIONS, DELETE");
response.addHeader("Access-Control-Allow-Headers", "reqid, xxxx");
}
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// 简单请求,直接设置Access-Control-Allow-Origin就可以了
response.addHeader("Access-Control-Allow-Origin", "*");
// 要正确设置响应类型,避免IE出现下载
response.setContentType("application/json");
response.getWriter().write("{\"id\":1, \"name\":\"zhangsan\"}");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
在a域请求b
我们做一个实验:
首先在b域访问,就是b域调用b域:
再次在a域访问,就是a域调用b域:
---
我们做一个实验:
我们在a域名,访问b域:
假如没有处理的话:
看下调试结果:
解决办法:
1.jsonp,原理和跨域读取cookie的本质是一样的。
就是根据javascript脚本动态的生成代码的。
后台:
前台:这个脚本执行完毕的结果
直接执行这个代码:
这就是jsonp实现的最本质的原理。
代码的问题:
第一个问题:硬编码
2.
加载之后就被执行完毕了,就是解析到这一行的时候,需要的时候生成。
回调+函数名对应的真实的函数就是showResult。
--
另一个函数:
---
这就是jsonp的原理,实际上我们已经实现了jsonp。
看下过程:
这个是防止缓存的。
我们看下后台:
---
CORS
第二个问题:jsonp要改后台的代码,我们这次要重新定义下
我们看下错误的信息:
这个是浏览器获得了一个相应的结果,但是是没有被授权的。
后台:
结果:
改进:写的请求是来源是被我允许的,这里是a域过来的 往b域请求 所以允许的是a域 可以加多个域
尽量不要用*。
继续改进:
我们复杂化一下ajax请求,比如改为psot请求,加header等。
结果:
分析原理:
后台:
看下结果:
看下是被请求了两次的:
第一次是发起的OPTIONS请求:
第二次:
对比:
jsonp都支持,cros新的浏览器
jsonp要改后台,cros写在配置文件就可以了
jsonp只支持get。post都支持的。
总结:
---03---
dom和jquery对象的区别:https://www.cnblogs.com/zhangyinhua/p/9487096.html
IFrame。
1.同域的javascripe如何通过frame实现互访
代码:
---
2.跨子域的访问
one方法:https://www.bbsmax.com/A/o75Nj2o95W/
关于跨域:
sub.a.com和www.a.com也是跨域的,跨域的是子域。
点击第四个按钮之后:
看下控制台:子页面加载了,但是title没有变。
就是我们访问这个子域的title被阻止了。
跨子域的解决方式就是提升域的级别:
在一个界面修改:
在另外一个界面修改:
再次测试,可以访问
---
3.跨全域的访问
注意跨域是跨域的属性访问,现在我们的最终的目的是将sub的属性也就是title写在main的p标签里面。
获取sub3的title之后,直接向mian发起请求是跨域的是被阻止的。
实现思路:
上面的是页面的重定向是没有跳转的问题的。
局限:借助中间界面,参数传递的是有限的。
---
如何设置:
postMessage的三个要素
关于安全限制:页面有postMessage,发给父亲,别人在嵌入我们页面的时候就可以收到我这个页面的消息,不安全,可以限制非法的不给权限。
mian.jsp如何接收消息?
案例:
看下传递过来的内容是什么?
:发送者所在域的
:数据
:发送者子窗口的window对象
---
页面之间的通信主要是干什么呢?
1.调用另外一个页面的某个方法,在子页面调父页面的fun方法,完成子页面向父页写入title的操作
2.访问另外一个页面的属性,父页面访问子页面的title,显示在自己的p标签
3.向另外一个页面写入信息,改写子页面的title
代码:
第一步发送,就是给父亲发送:
1.目标对象的窗口
2.调用的目标方法的方法名
3.参数
4.可选,
第二步:接收另外一个页面传回来的方法进行处理
---
其他的函数等,以后再研究下。
---
---04---