利用angular4和nodejs-express构建简单网站(十一)—HttpClient拦截器和路由守卫

news/2024/4/28 18:20:39/文章来源:https://blog.csdn.net/weixin_33787529/article/details/88846480

上一节介绍了好友模块,这一节介绍和好友模块中的控件有关的三个服务程序。

用HttpClient拦截器发送用户认证信息

在进入好友模块之前,需要向服务器发送认证信息,在这里使用angular的HttpClient拦截器进行发送。
拦截器的官方解释为:HTTP 拦截机制是 @angular/common/http 中的主要特性之一。 使用这种拦截机制,你可以声明一些拦截器,用它们监视和转换从应用发送到服务器的 HTTP 请求。 拦截器还可以用监视和转换从服务器返回到本应用的那些响应。 多个选择器会构成一个“请求/响应处理器”的双向链表。如果想详细了解拦截器,可以看官方文档
我们利用拦截器在每次向服务器请求朋友列表时将认证信息加入到头部。
具体代码如下:

import { Injectable } from '@angular/core';
import { HttpEvent, HttpInterceptor, HttpHandler, HttpRequest } from '@angular/common/http';
import { Observable } from 'rxjs/observable';
import { AuthTokenService } from './authtoken.service';
@Injectable()
export class AuthInterceptor implements HttpInterceptor{constructor(private tokenServ: AuthTokenService){}intercept(req: HttpRequest<any>,next: HttpHandler) : Observable<HttpEvent<any>>{//获取认证信息const auth = this.tokenServ.getToken();//克隆request,加入新的头信息const authReq = req.clone({headers:req.headers.set('Authorization', 'Bearer ' + auth)});return next.handle(authReq);}
}

要实现拦截器,就要实现一个实现了 HttpInterceptor 接口中的 intercept() 方法的类(AuthInterceptor)。在intercept()方法中先通过AuthTokenService的getToken()方法取得认证信息。这些认证信息是在登录或注册成功后由服务器发回来的jwt认证信息。服务器如何发送这些信息请参考第三节的内容,认证信息的内容是登录或认证的用户ID。因为HttpRequest 实例的属性却是只读(readonly)的,要修改请求信息只能先克隆它。在这里利用clone()方法在请求的头部信息中加入认证信息( clone() 方法的哈希型参数允许你在复制出克隆体的同时改变该请求的某些特定属性)。最后调用 next.handle(),以便这个请求流能走到下一个拦截器,并最终传给后端处理器。
最后还需要向模块这个拦截器,这个AuthInterceptor拦截器就是一个由 Angular 依赖注入 (DI)系统管理的服务,你必须在提供 HttpClient 的同一个(或其各级父注入器)注入器中提供这些拦截器。在好友模块的providers中加入

 {provide: HTTP_INTERCEPTORS,useClass: AuthInterceptor,multi:true}

现在在好友模块中每个发送到服务器的请求都会在头部加上认证信息。
补充内容:服务器jwt认证中间件
express的jwt中间件定义代码如下:

var expressJwt = require('express-jwt');
//使用jwt拦截
app.use(expressJwt({secret: 'secret'
}));
//处置jwt异常
app.use(function (err, req, res, next) {if (err.name === 'UnauthorizedError') {res.status(401).send({'code': 401,'msg': 'invalid token'});}
});
app.use('/friends', friends);

一定要把处理friends访问的路由放到jwt中间件后面,不然jwt无法进行验证。

利用路由守卫保证未登录用户无法访问好友信息

在上一节介绍路由时,在路由配置中加入了canActivate: [AuthGuardService],这是angular路由守卫服务,路由守卫的作用在官方文档中的解释如下:
现在,任何用户都能在任何时候导航到任何地方。 但有时候这样是不对的。
该用户可能无权导航到目标组件。
可能用户得先登录(认证)。
在显示目标组件前,你可能得先获取某些数据。
在离开组件前,你可能要先保存修改。
你可能要询问用户:你是否要放弃本次更改,而不用保存它们?
你可以往路由配置中添加守卫,来处理这些场景。

守卫返回一个值,以控制路由器的行为:
如果它返回 true,导航过程会继续
如果它返回 false,导航过程会终止,且用户会留在原地。
在这里我们利用路由守卫要求用户先登录才能导航到birthday模块中的控件。
代码如下:

import { Injectable } from '@angular/core';
import {CanActivate,ActivatedRouteSnapshot,RouterStateSnapshot,Router
} from '@angular/router';
import { UserService } from './user.service';
import { AuthTokenService } from './authtoken.service';
@Injectable()
export class AuthGuardService implements CanActivate {constructor(private tokenServe: AuthTokenService,private router: Router) { }canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {if (this.tokenServe.getToken() !== null) {return true;}this.router.navigate(['/login']);return false;}
}

路由守卫类也是一个注入服务类,它需要实现CanActivate接口的canActivate()方法。canActivate()方法实现了守卫代码。代码很简单,从AuthTokenService类的getToken()中获取认证信息的值,如果有就返回true,如果没有就导航到登录页面。并返回false。
最后记住在birthday模块中providers中加入AuthGuardService。

birthday.service数据提供服务介绍

BirthdayService类为birthday模块提供了数据服务,代码如下:

import { Injectable } from '@angular/core';
import { HttpClient, HttpHeaders,HttpErrorResponse } from '@angular/common/http';
import { UserService } from '../user.service';import 'rxjs/add/operator/map';export class Friend {constructor(public fid: number,public fname: string,public fbirth: Date,public fnumber: string,public femail: string,public fgroup: string,public state: string,public photo: string,public uid:number) { }
}@Injectable()
export class BirthdayService {constructor(private userServ: UserService,private http: HttpClient) {}//获取全部朋友信息getFriends() {return this.http.get('http://localhost:3000/friends/friend-list',{ observe: 'response'});}//获取单个朋友信息getFriend(id: number | string) {return this.getFriends().map(res => {if (res.body['code'] === '200') {return res.body['results'].find(result => result.fid === +id);}});}//修改朋友信息editFriend(friend: Friend){const body = {'value':friend,'operate':'edit'};return this.http.post('http://localhost:3000/friends/editfriend',body);}//新建朋友信息newFriend(friend: Friend){const body = {'value':friend,'operate':'new'};return this.http.post('http://localhost:3000/friends/editfriend', body);}//删除好友deleteFriend(friend:Friend){const body = {'value':friend, 'operate':'delete'};return this.http.post('http://localhost:3000/friends/editfriend',body);}//错误处理handleError(err: HttpErrorResponse): string {if (err.error instanceof Error) {return '发生错误,错误信息:' + err.error.message;} else {console.log(`Backend returned code ${err.status}, body was: ${err.error['msg']}`);return err.error['msg'];}}
}

首先在类外定义了一个Friend类,在这个类中定义了friend信息。BirthdayService类的主要功能有6部分:

  • 获取全部朋友信息。通过HttpClient的get方法发送获取到全部的friend信息的请求。
  • 获取单个朋友信息。getFriends()方法返回的是一个Observable对象,利用Observable的map()函数的回调找到对应id的单个friend对象,并继续发射Observable对象。
  • 修改朋友信息。将修改后的friend信息post到服务器。在发送的body中,除了修改后的friend对象,还发送了一个字符串属性:'operate':'edit',用于区分是修改friend还是新建friend,这了的edit代表修改信息。(具体的服务器操作代码将在下一章介绍)。
  • 新建朋友信息。和修改friend信息同理,只不过将body中的'operate'改为'new'。
  • 删除好友。也和修改friend信息同理,只不过将body中的'operate'改为'delete'。
  • 错误处理。如果是客户端(angular代码)出了错,会抛出一个 Error 类型的异常,由此判断如果错误的类型是Error类型,就表示前端出错,返回一条错误信息:'发生错误,错误信息:' + err.error.message;。如果是后端出错,就打印出错误状态和信息。

关于birthday模块的服务程序就介绍完了。下一章将要介绍服务器端express框架如何处理这些请求。今天将我的代码传到了github上,方便大家参考。地址如下:
前端:https://github.com/db991400/b...
后端:https://github.com/db991400/b...

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_732132.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux中使用Apache服务部署静态网站及配置介绍

在介绍Apache服务之前&#xff0c;先了解一下Web网络服务和其他两个服务。 配置文件 /etc/httpd/conf/httpd.conf 参数 部署Apache服务 [rootapache-server ~]# yum install httpd.x86_64 httpd-manual -y 安装服务 [rootapache-server ~]# systemctl start httpd 启动服务 [r…

网市场云建站 v4.8 增加私有模版库,开放 Mysql 配置、在线客服源码

百度智能云 云生态狂欢季 热门云产品1折起>>> 网市场云建站系统&#xff0c;结合各种产品&#xff0c;将一个网站的服务器成本降低到0.1元&#xff01;打破传统建站的高成本&#xff0c;让价格不再是阻碍的门槛&#xff0c;让每个人都能有自己的网站&#xff01; 延…

《WEB开发-阿里云建站》第1章 建站前的准备

1.1 阿里云ECS服务器建站概述 云服务器 ECS&#xff08;Elastic Compute Service&#xff09;是一种弹性可伸缩的计算服务&#xff0c;可以干很多事情&#xff0c;建站只是一小部分功能&#xff0c;关于更加具体的内容请参看阿里云官网。 https://www.aliyun.com/ 图1阿里云EC…

《WEB开发- Web服务器环境搭建》使用花生壳+II7搭建网站服务

1简介 IIS7及以上版本提供的请求-处理架构包括以下内容&#xff1a;  Windows Process Activation Service(WAS)可以让站点支持更多协议&#xff0c;不仅仅是HTTP和HTTPS&#xff1b;  可以通过增加或移除模块来自定义Web服务器引擎&#xff1b;  集成IIS和ASP.NET请求-…

《WEB开发-阿里云建站》第1章 建站前的准备(安装Linux服务器管理工具-宝塔)

这篇博客主要是安装Linux服务器管理工具-宝塔&#xff0c;关于阿里云的购买&#xff0c;域名注册备案&#xff0c;以及WDCP的安装请看我的这篇博客。 点击进入 1.4安装Linux服务器管理工具-宝塔 笔者的阿里云使用的Ubuntu16.04。 环境要求&#xff1a;  操作系统&#xf…

今天和大家分享几个可以接私活的网站(偏软件)(转载21ic)

关于程序员接私活&#xff0c;社会各界说法不一。按照作者的观点来说如果你确实急用钱&#xff0c;价格又合适&#xff0c;那就去做。如果不怎么缺钱&#xff0c;那就接私活之前要好好考虑。私活的钱不好挣是一个方面&#xff0c;更重要的是如果你把做私活的时间花在提升自己上…

ashx文件 验证是否登录_如何在百度站长平台验证网站?

如何在百度站长平台验证网站&#xff0c;验证网站都会遇到哪些坑&#xff0c;通过这篇文章让大家详细的了解一下如何验证网站&#xff0c;希望能帮助到更多小伙伴。那么多人都在使用百度站长平台&#xff0c;可是依然有大部分人不知道如何正确使用百度站长平台工具&#xff0c;…

我的家乡网站模板_韩国留学之 学业计划书amp;自我介绍怎么写?(附模板)

大家好&#xff0c;今天小雯来讲讲韩国留学之申请材料那点事儿~最近&#xff0c;有很多同学来找小雯咨询学习计划书的范文&#xff0c;好像对留学资料无从下手&#xff0c;其实&#xff0c;看似很难的学习计划书和自我介绍&#xff0c;一点都不难。如果学校提供模板就按学校模板…

一个好玩的网站http://patorjk.com/

这是一个特别万能的工具 输入网址&#xff1a; http://patorjk.com/ 将会出现这个&#xff1a; 这里可以做的东西简直太多了&#xff01; Apps: Visualizations: Games and Misc&#xff1a; 功能众多&#xff0c; 1.我们可以做springboot 的banner自定义&#xff0c; 感觉…

restful接口开发实例_广州开发区网站

广州开发区网站学生荣获第46届世界技能大赛武汉选拔赛一等奖2项、二等奖3项大数据技术与应用主干课程&#xff1a;计算机网络技术、数据库技术应用MySQLs Python程序设计、Linux操作系统、Java程序设计工程数学、数据预处理、数据分析及应用、数据可视化、Hadoopx数据采集与网络…

npm 如何卸载swiper_如何快速搭建个人网站?

作者 l 白色蜗牛来源 l 蜗牛互联网(ID: woniu_internet)转载请联系授权(微信ID: 919201148)近期精彩文章&#xff1a;福利&#xff01;iPhone 256G免费送前言建网站本身是一个很大的工程&#xff0c;涉及前端页面的搭建&#xff0c;网站数据的存储&#xff0c;还要购置服务器资…

如何用oracle分析网站,使用外部表分析eygle.com的网站访问日志

使用外部表分析eygle.com的网站访问日志经过使用Oracle的外部表对Oracle的警告日志文件、跟踪文件进行获取和分析之后&#xff0c;我发现外部表实在是非常易用&#xff0c;甚至到了随心所欲的境地(当然外部表尚不能修改外部文件)。使用外部表可以很容易的实现网站的访问日志分析…

modelandview跳转页面404_超快排:在百度搜索引擎网站404页面怎么做?

我们平时在百度搜索引擎网站的时候遇到过打开之后是错误页面&#xff0c;这些页面有提示可以返回之前页面和首页。为什么网站会有这样的页面呢&#xff1f;这是因为网站设置了404页面。我们在做百度搜索引擎SEO排名优化的时候&#xff0c;往往只注意网站结构专注与如何排名提高…

asp.net网站作为websocket服务端的应用该如何写

最近被websocket的一个问题困扰了很久&#xff0c;有一个需求是在web网站中搭建websocket服务。客户端通过网页与服务器建立连接&#xff0c;然后服务器根据ip给客户端网页发送信息。 其实&#xff0c;这个需求并不难&#xff0c;只是刚开始对websocket的内容不太了解。上网搜索…

java web 社区_我的第一个javaweb----模仿社区网站(二)

项目分层在写后台之前我给分了四层&#xff0c;每一层负责不同的功能&#xff0c;如图. 前端页面层&#xff1a;也就是浏览器展示给人看的&#xff0c;直接与人交互的界面. servlet层&#xff1a;受理前端页面发来的数据&#xff0c;由它接受前端发来的请求(request)做出不同的…

老榕智能建站软件_教你把网站建设得更好上线了智能建站系统

对于不懂技术、没有太多资金的个人和中小企业来说&#xff0c;要想生成自己的网站&#xff0c;就需要用到智能建站系统。智能建站比较简单&#xff0c;小白也能很快上手&#xff0c;不过这并不意味着你就可以随随便便搭建了。实际上&#xff0c;若想顺利建设出一个有用的网站&a…

vba获取正在运行网站的源码_VBA教程连载——第三节:如何运行宏

宏的运行方式有以下几种&#xff1a;第一种&#xff0c;自我录制运行打开开发工具-自己去录制一个宏&#xff0c;然后给它命名&#xff0c;录制完成后运行。至于具体怎么录制&#xff0c;我们下节课再细谈。注意&#xff1a;内置宏的表格&#xff0c;一般是没法直接保存的&…

html seo 优化,SEO优化中常见的四种html标签作用

对于SEOer来说&#xff0c;在HTML代码中&#xff0c;使用一些标签&#xff0c;更利于搜索引擎蜘蛛的读取&#xff0c;适当布局一些优化标签&#xff0c;可能会有意想不到的结果。下面就列举几个标签的妙用。1.标题标签。在网页html代码中 h1 标签是定义最大的标题。在整个页面中…

Nginx学习四:静态网站部署

文章目录第一步&#xff1a;通过Xftp将ace-master到linux服务器/opt/static目录下&#xff0c;为了演示方便&#xff0c;将名字改为ace第二步&#xff1a;修改nginx.conf配置文件在server中第三步&#xff1a;重启nginx服务器第四步&#xff1a;成功访问测试&#xff1a;通过ht…

php网站怎么做集群,如何构建一个网站集群 - 简庆旺个人博客|PHP教程|PHP学习|Python学习|Python教程|Seo学习|Seo教程...

网站业务大了&#xff0c;可能就需要一个集群&#xff0c;来保障业务的稳定性&#xff0c;我根据自己的学习工作经验&#xff0c;做了下总结。一&#xff1a;DNS负载均衡dns轮询&#xff0c;自动把流量分散到不同的服务器&#xff0c;避免单个服务器挂了。比如用的dnspod&#…