CORS跨域请求的限制与解决

返回数据时设置头信息,只能有一个域名,需要多个域名要判断

const http = require('http')
http. createServer(function (request, response) {res.writeHead(200,{"Access-Control-Allow-Origin":'*'})
}).listen( 8887 )
console.log( 'server listening on 8887' )

CORS跨域限制以及预请求验证

允许方法

  • GET

  • HEAD

  • POST

允许Content-Type

  • text/ plain
  • multipart/form-data
  • application/x-www-form-urlencoded

其他限制

  • 请求头限制

  • XMLHttpRequestUpload对象均没有注册任何事件监听器

  • 请求中没有使用ReadableStream对象

预请求

const http = require('http')
http. createServer(function (request, response) {res.writeHead(200,{"Access-Control-Allow-Origin":'*',//设置允许的请求头'Access-Control-Allow-Headers':'X-Test-Cors ',//设置允许的请求方法'Access-Control-Allow -Methods': ' POST, PUT , Delete',//设置最长时间'Access-Control-Max -Age' : '1000'})
}).listen( 8887 )
console.log( 'server listening on 8887' )

缓存头Cache-Control的含义和使用

可缓存性

  • public

    • 任何代理服务器都可以对数据进行缓存
  • private
    • 只有发起请求的浏览器可以缓存
  • no-cache
    • 任何一个节点都不可以缓存

到期

  • max-age=

    • 设置时间过期,过期后再次发送请求到服务器请求信内容
  • s-maxage=

    • 在代理服务器里才生效
  • max-stale=

    • 在max-stale时间内,即使max-age时间过期,也可以使用(浏览器用不到)
const http = require('http')
http. createServer(function (request, response) {res.writeHead(200,{'Cache-Control': ' max-age=200'})
}).listen( 8887 )
console.log( 'server listening on 8887' )

刷新缓存:可以文件名后加入根据内容生成的哈希码。

重新验证

  • must-revalidate

    • 如果缓存已经过期,需要向源服务端重新获取数据,不能直接使用
  • proxy-revalidate

    • 缓存服务器必须在过期时在源服务器重新请求

其他

  • no-store

    • 本地和代理不可以缓存
  • no-transform
    • 不可以随便改动返回的内容

缓存验证Last-Modified和Etag的使用

Last-Modified

  • 上次修改时间

  • 配合If-Modified- Since或者If-Unmodified-Since使用

  • 对比上次修改时间以验证资源是否需要更新

Etag

  • 数据签名
  • 配合If-Match或者If-Non-Match使用
  • 对比资源的签名判断是否使用缓存
if (request.url === '/script.js'){console.log(request.headers)const etag = request.headers('if-none-match')if(etag === '777'){response.writeHead(304,{'Content-Type': 'text/javascript','Cache-Control': ' max-age=200000,no-cache','Last-Modified':'123',"Etag":'777'})response.end('456')}else{response.writeHead(200, {'Content-Type': 'text/javascript','Cache-Control': ' max-age=200000,no-cache','Last-Modified':'123',"Etag":'777'})response. end('console.log("script loaded")' )}}

cookie和session

Cookie

  • 通过Set-Cookie设置
  • 下次请求会自动带上
  • 键值对,可以设置多个

不能够跨域去设置Cookie

Cookie≠session

Cookie属性

  • max-age和expires设置过期时间
  • Secure只在https的时候发送
  • HttpOnly无法通过document.cookie访问
const http = require('http')
http. createServer(function (request, response) {response.writeHead(200, {'Content-Type': ' text/html','Set-Cookie':['id=123;max-age=2','abc=456;HttpOnly']})
}).listen( 8887 )
console.log( 'server listening on 8887' )

HTTP长连接

HTTP1.1中有6个并发的链接

HTTP2在一个TCP链接可以并发的发送多个请求

const http = require('http')
http. createServer(function (request, response) {response.writeHead(200, {'Content-Type': ' text/html',"Connection":"close","Connection":"keep-alive"})
}).listen( 8887 )
console.log( 'server listening on 8887' )

数据协商

分类

  • 请求(客户端)

    • Accept

      • 明确想要接收数据的类型
    • Accept-Encoding
      • 明确编码方式,限制服务端压缩方式
    • Accept-Language
      • 返回信息判断是中文还是英文
    • User-Agent
      • 判断浏览器相关信息
  • 返回(服务端)

    • Content-Type

      • 选择一种数据格式,作为真正返回的数据格式进行返回(申明)
    • Content-Encoding
      • 对应Accept-Encoding
    • Content-Language
      • 对应Accept-Language
const http = require('http')
http. createServer(function (request, response) {response.writeHead(200, {'X-Content-Type-Options':'nosniff','Content-Encoding':'gzip'})
}).listen( 8887 )
console.log( 'server listening on 8887' )

Redirect

301:永久跳转(变更),除非清除浏览器缓存

302:临时跳转

const http = require("http");
const fs = require("fs");
http.createServer(function (req, res) {console.log("request come", req.url);if (req.url === "/") {res.writeHead(302, {Location: "/new",});res.end("");} else {res.writeHead(200, {"Content-Type": "text/html",});res.end("<div>this is content</div>");}
}).listen(8888);
console.log("server listening on 8888");

CSP

全称Content-Security-Policy,意为内容安全策略

了解更多参考网址

作用

  • 限制资源获取
  • 报告资源获取越权

限制方式

  • default-src限制全局
  • 指定资源类型
    • connect-src

      • 请求发向的目标的限制
    • font-src
      • 策略可以包含一个或多个源
    • frame-src
      • 可以允许一个或多个源
    • media-src
      • 可以允许一个或多个源
    • manifest-src
      • 可以允许一个或多个源
    • img-src
      • 图片可以从哪些网址上加载
    • style-src
      • 样式和脚本的资源从哪些网址上加载
    • script-src
      • 样式和脚本的资源从哪些网址上加载
    • 。。。

实例

  • 只能限制去加载我们本站提供的外链的脚本

    "Content-Security-Policy": "default-src default-src\'self\' "
    
  • 只能限制加载某个网站的内容

    "Content-Security-Policy": "default-src default-src\'self\' https://www.baidu.com"
    
  • 只能限制表单

    "Content-Security-Policy": "default-src \'self\'; form-action \'self\'"
    

[HTTP] HTTP各种特性总览相关推荐

  1. Html5新特性总览

    Html5新特性总览 1.HTML5 新元素 标签 描述 < article> 定义页面独立的内容区域. < aside> 定义页面的侧边栏内容. < bdi> 定 ...

  2. 特性总览:核心特性、数据存储、Web技术、框架整合与测试

    Spring的事件是基于Java的标准事件进行扩展的,但与Java的标准事件会有一些区别 资源管理也是继承了Java的资源管理,它的有些API是借鉴了Java核心的底层API的实现 Java默认就支持 ...

  3. 【ES6-11(2015-2020)】特性总览与开发环境准备

    文章目录 1. ES6-11思维导图 2. 环境安装 3. 构建开发环境 1. ES6-11思维导图 看到这么多特性,是不是很慌,不要着急,总会学会的~ 2. 环境安装 Node 环境安装 下载地址: ...

  4. java11 是长期支持_这里有你不得不了解的Java 11版本特性说明

    「MoreThanJava」 宣扬的是 「学习,不止 CODE」,本系列 Java 基础教程是自己在结合各方面的知识之后,对 Java 基础的一个总回顾,旨在 「帮助新朋友快速高质量的学习」. 当然 ...

  5. Redis4.0、5.0、6.0、7.0特性整理(持续更新)

    最近研究研究新版本redis的新特性,网上查了查资料,这里记录一下. 0. Redis的版本迭代和里程碑 Redis从发布至今,已经有十余年的时光了,一直遵循着自己的命名规则: 版本号第二位如果是奇数 ...

  6. H5的新特性及部分API详解

    h5新特性总览 移除的元素 纯表现的元素: basefont.big.center.font等  对可用性产生负面影响的元素: frame.frameset.noframes 新增的API 语义: 能 ...

  7. H5的新特性及API详解(很惊人)

    H5的新特性及API详解(很惊人) 2017-01-20 17:00 4057人阅读 评论(0) 收藏 举报  分类: h5(11)  js函数(64)  js技巧(15)  版权声明:本文为博主原创 ...

  8. OpenHarmony 3.1 Release版本特性讲解

    开放原子开源基金会已于2022-3-30正式发布了OpenHarmony 3.1 Release版本(也称330版本),随版本发布带来的还有OpenHarmony SDK-Ohos_sdk 3.1 R ...

  9. 第一章·MySQL介绍及安装

    一.DBA工作内容及课程体系 二.MySQL课程体系介绍 三.DBA的职业素养 四.MySQL简介及安装 01 什么是数据? 02 什么是数据库管理系统 03 数据库管理系统种类 04 MySQL发展 ...

最新文章

  1. 利用python开源库制作并验证torrent种子文件
  2. 程序员每天工作摸鱼俩小时,月薪35K?
  3. justify-content与align-items解析
  4. Migw用CMD编译C语言,NOTEPAD++用MinGW编译C,C++语言
  5. android中设置菜单栏,android – 菜单项没有显示在操作栏
  6. 如何看待事理图谱版magi--学迹
  7. jquery梳理之常用选择器
  8. 机器学习在植物病害识别研究中的应用
  9. 读取和写入文件的最简单方法
  10. hadoop环境准备-大数据Week5-DAY6-1-hadoop
  11. java如果目录不存在则创建目录_java – 创建一个目录,如果它不存在,然后再创建该目录中的文件...
  12. 一分钟了解contextlib模块
  13. 安卓微信自动抢红包插件优化和实现
  14. twaver API笔记
  15. python3调用cpp的方法——python调用so
  16. pacman系列命令
  17. 结构光的概念及其实现三维成像的主要原理
  18. python解一元二次方程
  19. 南京邮电大学操作系统实验五:Windows平台多进程共享内存通信
  20. 人工智能定价算法的发展,使得默示共谋更为普遍

热门文章

  1. sql 孩子兄弟表示法 所有子节点_matlab实现随机+蓄意攻击网络节点(1)
  2. Java 线程之间通信
  3. java 将一串字符串 转换成_简单几步,教你如何轻松的将Java中的字符串转换为Integer,你学会了吗?...
  4. MacOS 安装 Telnet
  5. SQL Server占用服务器内存过高
  6. 远程桌面连接服务器,提示身份验证错误,要求的函数不受支持,但又找不到加密Oracle修正
  7. 小汤学编程之JavaScript学习day01——认识JS、JS基础语法
  8. 7.16-7.22第二周
  9. Python并发编程:多进程-守护进程
  10. Linux IO 多路复用是什么意思?