重定向
1 前言
这节需要一些 HTTP 协议的知识,如果对 HTTP 协议不了解的可以先看看 MDN 关于 HTTP 介绍。
常见的跳转有 Res location  和 Res redirect,状态码有 301 ,302 ,这节我们一起学习 在 Koa 中常见各种跳转重定向功能。
我们先先考虑一个常见的场景,用户进入首页,后端发现没有登陆,自动跳转登陆页,输入用户名,密码后,自动跳转到首页,后面我们围绕着解决这个问题展开,大家可以先把 本章 Demo 源码拉下来,运行起来感受下(Demo 地址在小结里)。
2 原理
在 HTTP 协议中,重定向操作由服务器通过发送特殊的响应(即 redirects)而触发。HTTP 协议的重定向响应的状态码为 3xx 。
浏览器在接收到重定向响应的时候,会采用该响应提供的新的 URL ,并立即进行加载;大多数情况下,除了会有一小部分性能损失之外,重定向操作对于用户来说是不可见的。
3 302 vs 301
这个 2 个状态码我们经常看到,简单说 就是 302 是临时重定向,301 是永久重定向,我们开发过程中常用 302
二者差别可以查看 MDN文档
4 ctx.response.redirect(url, [alt])
Koa 重定向主要是用到 ctx.response.redirect 这个 api,它的状态码默认是 302, 它有以下几种用法:
ctx.redirect('back'); // 相当于浏览器起的 回退ctx.redirect('back', '/index.html'); // 回退某个目标页ctx.redirect('/login'); // 重定向到 登陆路由ctx.redirect('http://google.com'); // 重定向到地方网页
如果你想走 301 永久重定向,需要如下设置:
ctx.status = 301;ctx.redirect('/cart');ctx.body = 'Redirecting to shopping cart';
接下来,我们就用一个登陆的实例来讲解应用
5 登陆跳转实例
首先我们访问首页,判断是否登陆,没有登陆,跳转到登陆页,反之进入首页。
// router.jsrouter.get('/', async (ctx, next) => {if(!ctx.app.userInfo){ // 这里判断是否已经有了 userInfo 没有就直接跳转到 登录页ctx.redirect('/login')return}let title = 'hello koa2'await ctx.render('index', {title,})});// 这里处理渲染登录页面router.get('/login', async (ctx, next) => {if(ctx.app.userInfo){ctx.redirect('/')}await ctx.render('login', {title: 'login',})});
上面这段代码就实现我们需要的功能。
接下来我们看看登陆页面:
// view/login.ejs<html><head><meta charset="UTF-8"><title><%= title %></title><link href="./index.css" rel="stylesheet"></head><body><h1><%= title %></h1><img class="img" src="./koa.jpg"><form action="/login" method="POST" enctype="application/x-www-form-urlencoded">姓名: <input name="userName" id="userName">密码:<input name="passWord" id="pass" type="password"><button id="loginButton" type="submit">登录</button></form></body></html>
这样用户跳转到登陆页,输入用户名密码,在服务端做校验,代码如下:
// rouer.jsconst { login } = require('./controller/login')router.post('/login', login);// controller/login.jsfunction login(ctx) {const token = '121212-45dfgffgfg'console.log('ctx.res.header', ctx.response.header)ctx.response.header.token = token// 下面这个段可以理解成cookie,标记用户登陆了ctx.app.userInfo = {name: '王二码字'}ctx.redirect('/')}module.exports = {login}
这样就完成了我们的检测用户是否登陆,登陆跳转的逻辑。
以上就是跳转的一个实际案例,大家可以好看看,在日常工作中,应用还是非常多的
6 小结
这节我们讲解了重定向常用方式,大家可以好好理解下,具体案例 Demo github地址。
