关于laravel框架的跨域请求/jsonp请求的理解
最近刚接触laravel框架,首先要写一个跨域的单点登录。被跨域的问题卡了两三天,主要是因为对跨域这快不了解,就在刚才有点茅塞顿开的感觉,我做一下大概整理,主要给一些刚接触摸不着头脑的看,哪里写得不对的,也请大神指点,言归正传:
1.先用通俗易懂的话说下原理和几种跨域的方式,因为网上一搜都是追对某一种方式的专业性解答,我是消化不了多少。
第一种:jsonp 方式,这是什么方式呢,先要说一说JavaScript,在JavaScript中,有一个很重要的安全性限制,被称为“Same-Origin Policy”(同源策略),也就是说JS只能访问当前项目的页面。AJAX是基于XMLHttpRequest(这个请自行百度了解)实现的,所以AJAX 一类的请求肯定也是不能跨域请求的。 然后jsonp方式呢,虽然一般是再$.ajax 方法里面设置dataType: 'jsonp',但是发送请求出去的时候,已经跟ajax 没多少关系了,不管你设置type : get 还是 post ,它都是通过get发送请求的,可以说这个已经属于 jsonp 协议了,这是个非官方协议。发一下代码:
$.ajax({
url: 'http://lrz.laravel.com/auth/login',
type: 'get',
dataType: "jsonp",
jsonp: "callback",
data: {user_id:user_id,name:name},
success: function (data) {
console.log(data);
},
error:function()
{
alert("error");
}
})
当设置dataType 为 jsonp的时候就是jsonp请求了,然后 下面的 jsonp: "callback", 什么意思呢,jsonp方式会在客户端注册一个 js 的 callback方法,并通过GET方式发送到服务器,见连接:
- Request URL:http://lrz.laravel.com/auth/login?callback=jQuery21307739646233126818_1491549029207&user_id=1&name=%E5%90%95%E7%91%9E%E6%94%BF&_=1491549029208
jQuery21307739646233126818_1491549029207 这个方法就是客户端注册的。
然后服务器端怎么处理呢,接收 callback 的值,并返回一个JS方法的方式告知客户端,就是 return jQuery21307739646233126818_1491549029207(json_encode([1,2])); 这样的方式,客户端才能通过success: function (data) {} 获取到返回的值了,这就是通过JS注入的方式实现的 跨域请求,顺便我发一下 laravel 的返回方式:
$callback = $request->input('callback');
$arr = array('status'=>'200');
$user_id = $request->input('user_id');
$name = $request->input('name');
return response($callback.'('.json_encode($arr).')')->withCookie(Cookie::forever('name', $name))->withCookie(Cookie::forever('user_id',$user_id));
这么写是为了生成服务器端的cookie,用不着的小伙伴就忽略。
第二种方式就是通过html5 WebSocket标准 W3C方式,这个我一开始跟JSONP 弄混了,这个跟jsonp 又没关系了,这种方式通过设置一下头部信息就能实现跨域了,
Access-Control-Allow-Origin : 指明哪些请求源被允许访问资源,值可以为 "*","null",或者单个源地址。
服务器端主要设置这个值就能让其他的网址访问他了,用AJAX就能拿到服务器的数据了,我突然感觉这个方式好简单.. 已经能满足我的需求了,比jsonp 方式还安全。关于laravel的开启跨域方式可以看这篇文章: http://www.tuicool.com/articles/3yEFVz2,我就不多说了。
第一次写总结,哈哈,就写这么多了。
关于laravel框架的跨域请求/jsonp请求的理解的更多相关文章
- Springboot跨域 ajax jsonp请求
SpringBoot配置: <dependency> <groupId>org.springframework.boot</groupId> <artifac ...
- Django框架 之 跨域请求伪造
Django框架 之 跨域请求伪造 浏览目录 同源策略与Jsonp 同源策略 Jsonp jQuery对JSONP的实现 CORS 简介 两种请求 同源策略与Jsonp 同源策略 同源策略(Same ...
- cors跨域和jsonp劫持漏洞 和 同源策略和跨域请求解决方案
cors跨域和jsonp劫持漏洞: https://www.toutiao.com/a6759064986984645127/ 同源策略和跨域请求解决方案:https://www.jianshu.co ...
- 前端跨域解决方案: JSONP的通俗解说和实践
对于前端开发者而言,跨域是一个绕不开的话题.只有真正明白了各种方案的工作机制,才能针对性地进行跨域方案选型.本文将以探索者的视角,试图用最通俗的语言对一种"鼎鼎大名"的跨域解决方 ...
- SSM框架处理跨域问题
什么是跨域 跨域是指从一个域名的网页去请求另一个域名的资源.比如从www.baidu.com 页面去请求 www.google.com 的资源.跨域的严格一点的定义是:只要 协议,域名,端口有任何一个 ...
- Ajax跨域:Jsonp原理解析
推荐先看下这篇文章:JS跨域(ajax跨域.iframe跨域)解决方法及原理详解(jsonp) JavaScript是一种在Web开发中经常使用的前端动态脚本技术.在JavaScript中,有一个很重 ...
- JQuery实现Ajax跨域访问--Jsonp原理
JavaScript是一种在Web开发中经常使用的前端动态脚本技术.在JavaScript中,有一个很重要的安全性限制,被称为“Same-Origin Policy”(同源策略).这一策略对于Java ...
- Nginx 解决WebApi跨域二次请求以及Vue单页面问题
一.前言 由于项目是前后端分离,API接口与Web前端 部署在不同站点当中,因此在前文当中WebApi Ajax 跨域请求解决方法(CORS实现)使用跨域处理方式处理而不用Jsonp的方式. 但是在一 ...
- jQuery(三) javascript跨域问题(JSONP解决)
加油~ --WH 一.什么是javascript跨域问题? 域:服务器域名,唯一标识(协议,域名,端口)必须保证一致,说明域相同 跨域:在一个服务器上,去访问另一个服务器上,并且得到另一个服务器返回回 ...
随机推荐
- 3D Touch开发全面教程之Peek and Pop - 预览和弹出
## 3D Touch开发全面教程之Peek and Pop - 预览和弹出 --- ### 了解3D Touch 在iPhone 6s和iPhone 6s Plus中Apple引入了3D Touch ...
- 【2017年新篇章】 .NET 面试题汇总(二)
本次给大家介绍的是我收集以及自己个人保存一些.NET面试题第二篇 第一篇文章请到这里:[2017年新篇章] .NET 面试题汇总(一) 简介 此次包含的不止是.NET知识,也包含少许前端知识以及.ne ...
- SecureCRT文件传输模式
前言 如下图所示,SecureCRT6.5.0 有4种文件传输模式. 1)ASCII:最快的传输模式,但只能传文本 2)Xmodem:非常古老的传输协议速度较慢,但由于使用了CRC错误侦测方法,传输的 ...
- 每天一个Linux命令(07)--mv命令
mv命令是move的缩写,可以用来移动文件或者将文件改名,这也是个常用命令,经常用来备份文件或者目录. 1.命令格式: mv [选项] 源文件或目录 目标文件或目录 2.命令功能: 视mv命令中第 ...
- RHL 6.0学习日记, 先记下来,以后整理。
今天又遇到哪些问题呢? 1.配置网络的问题,我把网络配置文件胡乱改了,然后就上不了网了 因为一直都没怎么用到网络,网线都不怎么连接的,今天只是突然想ping一下,于是就Ping 了一下,一开始ping ...
- 1. Two Sum★
题目内容:Given an array of integers, return indices of the two numbers such that they add up to a specif ...
- 3月题外:关于GeoServer和OpenLayers3实用开源插件或组件的总结
Geoserver篇 注意: 1)用法 GeoServer-Extension的使用方法:将jar包直接放入部署在tomcat上的geoserver/WEB-INF/lib文件夹中 2)在安装插件时, ...
- Oracle Jdbc驱动下载及安装本地maven仓库
由于二进制许可 binary license的限制,oracle jdbc驱动不能通过共有仓库来获取,所以你可以下载下来添加到自己的本地仓库或私有仓库中. 添加到本地仓库步骤如下: 下载Oracle ...
- JS中一些常用的内置对象
在JS中,经常会遇到明明知道一个对象有某个属性或方法,可是又不知道怎么写的情况.下面,我就罗列了一些JS中常用的内置对象的属性和方法. Math对象: Math对象的作用是执行常见的算术任务. 首先M ...
- SFTP远程文件上传
远程服务器remote_host=192.168.29.142用户为remote_www,用户当前目录为/home/remote_www 本地服务器local_host=192.168.29.135用 ...