博客项目登录(前端联调)

html页面联调

  • 登录功能依赖cookie,必须用浏览器来联调
  • cookie跨域不共享的,前端和server端必须同域
  • 需要用到nignx做代理,让前后端同域

跑起前端页面

  • http-server是一个轻量级的基于nodejs的http服务器,好处:可以使任意一个目录成为服务器的目录,完全抛开后台的沉重工程,直接运行想要的js代码
  • 前端项目中,全局安装http-server:npm i -g http-server跑起静态页面
  • 设置前端端口为8001:http-server -p 8001(前后端端口不能一样):前端项目cmd
  • 访问前端首页:前端首页
  • 此时我们需要nginx来使前后端使用同一个端口。

nginx

  • 高性能的web服务器,开源免费
  • 一般用于做静态服务、负载均衡(本课用不到)
  • 还有反向代理(本课用到),即客户端不可见的代理:反向代理示意图

nginx下载与配置

  • 官网下载
  • 配置:(管理员权限打开记事本)Nginx所有配置文件都在Nginx根目录conf子目录中(可先不配置)
  • 运行运行

nginx命令

含义 nginx命令
测试配置文件格式是否正确 nginx -t
启动nginx start nginx(注意顺序!
重启nginx nginx -s reload
停止nginx nginx -s stop
查看版本 nginx -v
查看帮助信息 nginx -h
重启日志文件 nginx -s reopen

nginx反向代理的配置

(管理员权限打开记事本)修改Nginx核心配置文件:conf\nginx.conf

  • **修改worker_processes**:worker_processes我的电脑是4核的,所以设置为4
  • 修改server:server
  • #就是注释,注释location注释location
  • 进行反向代理进行反向代理
    • 如果location是静态页面就转发到8001端口,location是api开始的就转发到8000端口
  • 测试测试
  • 启动nginxstart nginx注意顺序!没有报错则启动成功)
  • 之前后端8000端口,前端8001端口无法获取8000端口的数据,现在测试8080端口8080端口

前端联调

个人中心只显示自己的数据

前端

http-test中admin.html中发送ajax请求的地址中再加上一个isadmin=1 参数,使用登录者的用户名
前端admin.html

后端

  • blog-1中的router-blog.js中,修改获取博客列表的路由router-blog.js
    • 之前没有isadmin时,博客列表的author是由req.query.author获取到的,现在有了isadmin后,则强制从req.session.username获取author,那么访问的就是本人的博客列表了。

联调

  1. 启动nginx,打开8080端口,进入首页:首页
  2. 点击进入详情页:详情页
  3. 尝试在尚未登录情况下进入admin管理中心尚未登录情况下进入admin管理中心
    • 可以看到并未显示管理中心,此时前端可以做个提示框或者跳转信息之类的。此时创建博客也会显示数据错误。
  4. 进行登录登录
  5. 登录后自动跳转管理中心管理中心
  6. 点击创建博客,创建完成后自动跳转管理中心:管理中心
  7. 可点击进入查看博客内容博客内容
  8. 编辑博客编辑博客
  9. 搜索博客搜索博客

总结

cookie是什么?session 是什么?如何实现登录?

  • cookie是跨域不共享的存储在浏览器的一段字符串(最大5kb),每次发送http请求时都会将请求域的cookie一起发送给server端。
  • session即server端存储用户信息,也就是cookie中存储userid,server端对应username/个人信息。
  • 实现登录
    • 用戶第一次发送登录的http请求时,请求头中并不存在cookie(即userid),此时server端生成一个cookie(即userid)返回给用户,这个userid对应用户的用户名和密码。下次访问时用户的请求头中就会携带这个userid,那么后端就会去解析cookie读取userid放到sessionId上,看sessionId对应的属性值(对象)中是否有username这个属性,有则判断为已登录。也就不需要重复登录了。
    • session是一个对象,它的属性名即cookie的userid,属性值是对象,这个对象中包括username、realname
    • session是存储在redis中的,这样就不会刷新页面就要求重新登录。

redis在这里扮演什么角色?有什么核心的价值?

  • redis在这用于存储session。
  • 这样一来session就不会保存在js变量中,不用担心访问量过大,内存暴增,也不会再正式线上运行时遇到多进程之间内存无法共享的问题。

nginx的反向代理配置,联调过程中的作用

  • 使用nginx实现反向代理就可以根据url派发不同的接口,让前端页面可发生ajax请求去获取后端的数据。
  • 假设前端页面是3000端口,后端页面是8000端口。那么用户打开页面时打开的就是3000端口的页面,前端页面中使用ajax请求获取数据时就会去获取3000端口下的对应路径的数据。而后端页面是8000端口,所以数据其实保存在8000端口下的对应路径中。这就无法获取数据此时使用nginx进行反向代理,遇到/api/开头的url时就分配到8000端口,遇到/开头的url时就分配到3000端口,这样就没问题了。
  • 补充:使用react书写前端页面时,将前端页面经过build编译后生成的html页面放入了后端项目,那么访问的就是后端项目的接口下的页面,那么前端页面发送ajax请求时也就不需要nginx进行反向代理了,因为此时前后端是用同一个接口运行起来的。