服务器相关知识
一. 服务器重定向
- 就是服务器主动修改地址, 一般用于网站引导注册登录功能(访问首页是自动跳转到登录页)
- 服务器重定向用响应头的302状态码实现
app.use((req,res)=>{
res.writeHead(302,()=>{
Location: 'http://127.0.0.1:8088/login.html';
});
res.end();
})
二. IP和域名
-
IP其实就相对于服务器在网络中的门牌号,因为IP地址是一个32位的二进制数,不方便记忆所以有了域名。
域名可以理解成IP的代号,使人更方便访问互联网。而不用去记IP数串。
DNS服务器(域名解析服务器)可以将域名和IP地址相互映射,把域名对应的ip解析出来,然后通过ip找到服务器.
如:https://www.baidu.com/
www.baidu.com就是域名, 可以访问百度
ip:14.215.177.38 也可以访问百度。但是显然域名更好记
-
可以通过在终端输入ping + 网址查看网站ip
三.中间件
-
就是开启服务器之后和路由响应之前要执行的函数。可以操作请求对象req和响应对象res
中间件的功能:
- 中间件可以执行任何代码
- 更改请求和响应对象
- 结束请求-响应周期
- 调用堆栈中的下一个中间件
// 导包 const express = require('express'); const bodyParser = require('body-parser'); // 创建服务器 const app = express() // 中间件 app.use((req,res,next)=>{ console.log('LOGGED') next(); // 不能少 }); /** * 写接口(注册路由) */ app.get('/go',(req,res)=>{ res.send('里好啊'); }) // 开启服务器 app.listen(8088, () => { console.log('服务器已开启') })
中间件里必须要有next(); 否则会挂起,不继续往下执行一直转圈
四.跨域
- 游览器使用Ajax时,如果请求的接口地址和当前打开的页面地址不同源,称之为跨域
- 游览器只有用ajax发送请求才会出现跨域。href属性和src属性不会出现跨域
- 游览器使用ajax向不同源的接口发送请求,称之为跨域访问
- 协议、地址和端口都一样叫同源,只要有一个不同就为不同源
- 为啥要区分同源和不同源
- 为了保护电脑的安全性,游览器不允许页面向不同源的接口请求数据,如果接口和网页不同源,游览器认为是2个不同的服务器
1. 解决跨域问题
-
JSONP方法
- 曾经专门解决各种跨域问题,但是随着时间现在慢慢淡出历史舞台
- 是前后端配合使用的
- 原理:通过动态创建script标签,用script标签的src请求没有跨域限制的特性来获取资源
-
CORS方法
-
目前主流的方案,很简单直接让后端设置响应头,允许资源共享
app.use((req,res,next)=>{ // 设置响应头,允许资源被访问|共享 res.setHeader('Access-Control-Allow-Origin', '*'); // *代表所有请求路径都可以请求 next() })
用中间件的方式设置资源共享,就不用在接口挨个设置
res.setHeader(‘Access-Control-Allow-Origin’,’*’);
*代表所有请求路径都可以请求
- 更简单的写法,第三方模块cors
// 导包 const express = require('express'); var cors = require('cors'); // 创建服务器 const app = express() // 用第三方模块cors设置 app.use(cors())
就app.use(cors())一句话搞定
效果和上面写的一样
-
2. jsonp的原理
-
通过动态创建script标签,用script标签的src请求没有跨域限制的特性来获取资源
-
就是前端页面通过src向后端发请求,后端通过传参方式向前端页面发内容
-
前端代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>jsonp的原理</title> <script src="../../jQuery/jquery-3.5.1.js"></script> </head> <body> <button class="btn">获取接口资源</button> <script> function fn(backData) { console.log(backData); } $(function (){ $('.btn').on('click', () => { var script = document.createElement('script'); $(script).attr('src', 'http://127.0.0.1:8086/a?callback=fn'); $('body').append(script); }) }) </script> </body> </html>
动态创建script设置src
然后通过src里的callback整理有的函数名传给后端
-
后端代码
// 导包 const express = require('express'); // 创建服务器 const app = express() app.get('/a',(req,res)=>{ // 后端要返回给前端的内容是 // {'name':'ash','age':29} // 所以写死返回fn()的调用不合理 // 解决办法,前端吧准备好的函数名用参数带过来 let callBack = req.query.callback; // 这里可以拿到前端传过来的事先准备好的函数名 res.send(`${callBack}({'name':'ash','age':29});`) // 通过传参方式向前端发内容 }) app.listen(8086,()=>{ console.log('服务器开启了') })
可以通过callback获取前端有的函数名。
然后通过传参方式向前端发内容
-
-
jquery使用jsonp
-
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>jquery使用jsonp</title> <script src="../../jQuery/jquery-3.5.1.js"></script> </head> <body> <button class="btn">获取接口资源</button> <script> $(function () { $('.btn').on('click', () => { $.ajax({ url:'http://127.0.0.1:8086/a', dataType:'jsonp', // 自动创建script标签 success:function(backData){ console.log(backData); } }) }) }) </script> </body> </html>
接口如果支持jsonp
那jquery使用jsonp只要加上dataType:'jsonp’就可以