02单点登陆-02

跨域的系统。

单域的话直接写入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---

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值