今天遇到了一个跨域请求登录验证的问题。所以有了尝试跨域的机会。

具体情景是,有一个登录界面写在名叫cas的站点上,但是相关的登录验证的后台接口是写在名叫earth的站点。

首先的反应是使用jsonp,但是jsonp只能get请求,而且一旦跨域会有权限问题(这个下面会说),更主要的是jsonp那种类似hack的写法总让我觉得别扭。当然最主要的是后台用stringMVC已经实现了CORS。

CORS是一种跨域资源共享的方式,和ajax实际上是没什么区别的,相对应的RESTFUL方法们都是可以的,实现方式上是有区别的。

这次就先总结下比较简单的,用GET发一个邮箱地址,让后台验证这个邮箱是否可用,返回true或者false。

首先先写一个客户端,这个客户端是用webstorm默认的方式起的,域名应该是localhost:63342

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<button id="cors">send cors</button>
</body>
<script>
var cors=document.querySelector('#cors');
cors.onclick=function () {
var xhr=new XMLHttpRequest();
xhr.open('GET','http://localhost:3001/getName',true);
xhr.withCredentials=true;
xhr.onload=function (data) {
console.log(data);
};
xhr.send(null);
}
</script>
</html>

这个页面就是点击一个按钮向3001端口发送一个GET请求,可以看到除了xhr.withCredentials=true;以外和ajax没什么区别,CORS基本上就是个服务端技术。另外提一句,在高程三上说需要在请求头上写一句Origin:XXXX来告诉服务端你的源信息,但是实际上我测试的时候发现即使不写,浏览器也会自动把这句加到请求头里。

var express=require('express');
var url=require('url');
var app=express();
var allowCrossDomain = function(req, res, next) {
res.header('Access-Control-Allow-Origin', 'http://localhost:63342');
res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
res.header('Access-Control-Allow-Headers', 'Content-Type');
res.header('Access-Control-Allow-Credentials','true');
next();
};
app.use(allowCrossDomain);
app.get('/checkEmail',function (req,res,next) {
var queryValue=url.parse(req.url).query;
if(queryValue==='fortunewheel@sina.com'){
res.send(true);
}else {
res.send(false);
} });
app.listen(3001);

可以看到比较明显的区别就是多了一个allowCrossDomain的中间件,这个中间件的作用就是向响应头里写一些东西。

为什么是响应头?下面是我的一点理解,不对欢迎指正:

跨域请求需要做处理的原因是同源策略,即协议、域名和端口必须完全相同才能发起请求。而同源策略实际上是浏览器行为,因为不做限制的跨域是比较危险的,所以各个浏览器都会做跨域限制。对于CORS会向服务端发送一个预请求,服务端写回响应头。浏览器发现预请求的响应头是允许自己发送请求的才会发送真正的请求。

下面这一句就是告诉什么站点是被允许的

res.header('Access-Control-Allow-Origin', 'http://localhost:63342');

浏览器就会知道服务器是允许这个站点进行跨域访问的。其实,这就是一个白名单机制。

其他的三条是什么意思百度下就好。稍微提一句,建议在客户端写上xhr.withCredentials=true; 对应的服务端也要加上对应的响应头。不过这样写,Access-Control-Allow-Origin就不能写*来允许所有站点请求,在实际工程上也很少允许所有站点。而这也是jsonp不好的地方,如果向设定请求权限要考虑使用其他方法,不如CORS简便。

当然,上面说的都是简单请求的CORS。HEAD GET POST方法下,使用某些请求头(嗯,传个json是肯定没问题)都是简单请求。

复杂请求的机制和简单请求不太一样,有空写写个下篇详细说明下。

用express实现CORS跨域(上-简单请求)的更多相关文章

  1. nodejs(15)express开启cors跨域

    express开启cors跨域 package.json "dependencies": { "body-parser": "^1.18.3" ...

  2. express和cors跨域

    使用express框架: Express: Express 是一个保持最小规模的灵活的 Node.js Web 应用程序开发框架,为 Web 和移动应用程序提供一组强大的功能. Express 框架核 ...

  3. django上课笔记7-jQuery Ajax 和 原生Ajax-伪造的Ajax-三种Ajax上传文件方法-JSONP和CORS跨域资源共享

    一.jQuery Ajax 和 原生Ajax from django.conf.urls import url from django.contrib import admin from app01 ...

  4. 4 伪ajax:jsonp、cors 跨域请求

    一.同源策略 https://www.cnblogs.com/yuanchenqi/articles/7638956.html 同源策略(Same origin policy)是一种约定,它是浏览器最 ...

  5. 同源策略与CORS跨域请求

    一.同源策略 1.简介 同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响.可以说Web是构建在同源 ...

  6. 浏览器的同源策略及CORS跨域解决方案 DRF

    一个源的定义 如果两个页面的协议,端口(如果有指定)和域名都相同,则两个页面具有相同的源. 举个例子: 下表给出了相对http://a.xyz.com/dir/page.html同源检测的示例: UR ...

  7. CORS跨域资源共享你该知道的事儿

    "唠嗑之前,一些客套话" CORS跨域资源共享,这个话题大家一定不陌生了,吃久了大转转公众号的深度技术好文,也该吃点儿小米粥溜溜胃里的缝儿了,今天咱们就再好好屡屡CORS跨域资源共 ...

  8. 如何在ASP.NET Core中实现CORS跨域

    注:下载本文的完整代码示例请访问 > How to enable CORS(Cross-origin resource sharing) in ASP.NET Core 如何在ASP.NET C ...

  9. Web APi之手动实现JSONP或安装配置Cors跨域(七)

    前言 照理来说本节也应该讲Web API原理,目前已经探讨完了比较底层的Web API消息处理管道以及Web Host寄宿管道,接下来应该要触及控制器.Action方法,以及过滤器.模型绑定等等,想想 ...

随机推荐

  1. UVA-11625-Nice Prefixes (DP+矩阵快速幂)

    题目(vjudge) 题面 题意: 你有K个字母,你需要用K个字母组成L长度的字符串,定义对于该字符串的任意前缀P 必须满足    ,输出方案数%1000000007的值. 思路: 首先可以想到一种简 ...

  2. Effective C++ 49,50

    49.熟悉标准库. C++标准库非常大. 首先标准库中函数非常多,为了避免名字冲突.使用命名空间std.而之前的库函数都存放于< .h>中,如今成为伪标准库.而不能直接将这些头文件所有直接 ...

  3. cvm母机宕机重启后数据库修复

    下午正在开周会,然后收到短信,说是X.X.X.X的机器ping不通了,一轮测试过后,发现是某台数据库服务器挂了,先不急着重启,问下tencent客服... 乖乖的好家伙,母机的主板坏了....一个小时 ...

  4. iOS 蓝牙功能 bluetooth

    现将创建蓝牙工程的要点总结一下,由于工程主要涉及中心模式,所以只总结中心模式的用法 1,引入CoreBluetooth.framework 2,实现蓝牙协议,如: .h文件如下 @protocol C ...

  5. Linux中的提示符

    root的提示符:# 一般用户的提示符:$

  6. Pairs of Integers

    Pairs of Integers You are to find all pairs of integers such that their sum is equal to the given in ...

  7. ORACLE client 11g r2 客户端开发环境配置

    一.安装ORACLE客户端,这里不做说明.需要注意的是,客户端解压位置应该在磁盘根目录下. 如果放在带中文字或者空格的文件名的路径下出了问题,可以放到磁盘根目录在安装.应该就会没有问题. 另外,一般安 ...

  8. Meeting-in-the-Middle (LA 2965)

    Meeting-in-the-Middle,又称“中途相遇法”.准确地说,它只是一种策略. 顺便说一下,这个算法真的很冷门! 结合这道题来讨论一下吧:LA 2965.ε(┬┬﹏┬┬)3 因为博主的英文 ...

  9. SAP后台作业记录操作

    [转http://blog.163.com/liang_ce_521@126/blog/static/709202152013073376596/]后台作业信息存储在透明表TBTCP(批作业步骤概述) ...

  10. Java并发之BlockingQueue

      一.Queue Queue是队列接口是 Collection的子接口.除了基本的 Collection操作外,队列还提供其他的插入.提取和检查操作.每个方法都存在两种形式:一种抛出异常(操作失败时 ...