要求

  后台提供的接口,不能让人随便输入个链接就能访问,而是要加入一个token,token是动态的,每次访问的时候判断,有权限并且未过期的时候才可以访问接口。

后台的设计是

  在登录的时候,首先要post提交一个请求,根据用户名密码,返回一个动态token,这个token会在服务器保存一段时间。在前端的其他接口请求的时候,都要在header中添加这个token,后台会进行验证。只有验证成功,才会返回对应的接口内容,否则会抛出401异常。

请求效果

  首先使用postman查看正常请求的效果
  第一次登录请求时,添加了Header和Body以后,返回一个动态token,其结果如下:

  服务器中保存了这个token值,然后再请求其他的get请求时,需要在Header中拼接这个token,才可以正常返回

添加token验证

  Ionic的使用的是httpclient 实现的请求,所有的请求被我写到了一个公共的http-api.service.ts 里面去了
  方法如下:

public access_token: string = '';
get<T>(endpoint: string, params?: any) {
const headers = {
headers: {
'Authorization': this.access_token
}
};
if (params) {
if (!options) {
options = {'params': params};
} else {
options['params'] = params;
}
}
return this.http.get<T>(this.url + '/' + endpoint, headers);
}

  在登录的时候,先进行token验证,并且将返回的验证码信息保存在http-api.service.ts 中

public firstPost(username: string, password: string) {
const headers = {
headers: {
'Authorization': 'Basic Y2xpZW50OnNlY3JldA==',
'Content-Type': 'application/x-www-form-urlencoded'
}
}; /*先token验证,虽然是post请求,但是发现直接将参数写到params 里面报错,所以就直接写到了url里面去了*/
this.httpApi.post('oauth/token?grant_type=password&username=' + username + '&password=' + password, null
, headers).subscribe(val => {
//返回值里,access_token代表生成的token验证码
if (val != null && val['access_token'] != null) {
this.httpApi.access_token = 'Bearer ' + val['access_token'];
}
}, response => {
let toast = this.toastCtrl.create({
message: '账号或密码错误',
duration: 2000,
position: 'bottom'
});
toast.present(toast);
},
() => {
});
}

备注:这样做的有一个缺点。因为把token值保存在service中,service是单例的,当service刷新的时候,这个token值就不存在了。而在angular中,网上说,刷新页面,就会刷新service。所以每次刷新页面,必须重新登录生成新的token 值,否则就会报401错误。为了解决这个问题,只有想办法把token值 保存在一个能够永远取到的地方了,比如 window.localStorage ,事实上这也是比较好的一个办法。

window.localStorage.setItem('access_token', 'Bearer ' + val['access_token']);

实现token超时,返回登录页面功能

1、添加自定义拦截器custom.error.handler.ts,如果返回401错误,这调用一个监听器方法,返回登录页(注意:a.这里Ionic 和 Angular是不一样的;b.没有@Injectable(),就没法使用构造函数)

import {ErrorHandler, Injectable} from "@angular/core";
import {Events} from "ionic-angular"; @Injectable()
export class MyErrorHandler implements ErrorHandler { constructor(private events: Events) {
} handleError(err: any): void {
if (err.status === 401) {
this.events.publish('userCheck');
}
// do something with the errorswitch (res.status) {
}
}

2、在app.module.ts 中添加引入

import {MyErrorHandler} from "./service/custom.error.handler";
...
providers: [
{provide: ErrorHandler, useClass: MyErrorHandler}
]
...

3、在一个Service 中添加一个全局变量,保证token超时只执行一次返回登录页方法

@Injectable()
export class CommonService {
/**
* 全局变量,保证userCheck 监听器方法,只执行一次
* @type {boolean} true可以执行, false不可以执行
*/
public userCheckNum: boolean = true;
...

4、在tabs.ts文件中添加监听器

ionViewDidLoad() {
this.userCheckListenEvents();
} ionViewWillUnload() {
this.events.unsubscribe('userCheck');
} userCheckListenEvents() {
this.events.subscribe('userCheck', () => {
if(this.commonService.userCheckNum){
this.commonService.userCheckNum = false;
let loader = this.loadingCtrl.create({
content: "链接超时,正在返回登录页",
duration: 3000
});
loader.present();
loader.onDidDismiss(() => {
this.commonService.userCheckNum = true;
this.nav.setRoot(LoginPage);
}); }
});
}

附录

  后台使用的是cuba platform 框架,cuba中关于token的设计是直接集成在登录功能里面的,在web-app.properties 配置文件里面可以进行配置
  如果添加 cuba.rest.anonymousEnabled = true ,那么任何人都可以访问了,就没有token验证
  如果有token验证,可以添加下面的配置,设置过期时间,单位是秒
    cuba.rest.client.tokenExpirationTimeSec=60
  具体参考官网文档:https://doc.cuba-platform.com/manual-6.8/rest_api_v2_ex_get_token.html

原创文章,欢迎转载,转载请注明出处!

Ionic3的http请求如何实现token验证,并且超时返回登录页的更多相关文章

  1. 客户端ajax请求为实现Token验证添加headers后导致正常请求变为options跨域请求解决方法

    客户端为了实现token认证,通过Jquery的ajaxSetup方法全局配置headers: 全局配置headers后会导致部分不需要token认证的请求变为options请求,导致跨域访问.报错信 ...

  2. koa2+redis+jwt token验证,简单注册登录

    首先新建文件夹命名koa-server,npm init,相关包的安装就不说了,这是我的package.json 新建index.js文件,编码如下,config全局配置不用管,redis是一个简单的 ...

  3. 需要加token验证的接口返回文件流下载

    没有加token之前,下载文件用的是a标签,直接下载. 现在要求是需要在header中加入token. getDownload(urls, fileName) { var url = urls; va ...

  4. Django 登录验证-自动重定向到登录页

    Web项目有些场景需要做用户登录验证,以便访问不同页面. 方法一:login_required装饰器 适用于函数视图. from django.contrib.auth.decorators impo ...

  5. C# 响应微信发送的Token验证,文字、图文自动回复、请求客服对话.....

    代码如下,有需要的可以参考: using System; using System.Collections.Generic; using System.Linq; using System.Web; ...

  6. angular数据请求 token验证

    angualr的token 验证会经常用在登录,注册等地方 对于token的使用方法按照以下步骤进行使用即可 1.新建一个服务 ng g service services /+服务名  eg:ng g ...

  7. .NET 微信Token验证和消息接收和回复

    public class wxXmlModel { public string ToUserName { get; set; } public string FromUserName { get; s ...

  8. 【JWT】JWT+HA256加密 Token验证

    目录 Token验证 传统的Token验证 JWT+HA256验证 回到顶部 Token验证 最近了解下基于 Token 的身份验证,跟大伙分享下.很多大型网站也都在用,比如 Facebook,Twi ...

  9. 基于.Net Framework 4.0 Web API开发(4):ASP.NET Web APIs 基于令牌TOKEN验证的实现

    概述:  ASP.NET Web API 的好用使用过的都知道,没有复杂的配置文件,一个简单的ApiController加上需要的Action就能工作.但是在使用API的时候总会遇到跨域请求的问题, ...

随机推荐

  1. H5 表单标签

    33-表单标签3 列表数据 注意点: 1.下拉列表不能输入内容, 但是可以直接在列表中选择内容 2.可以通过给option标签添加一个selected属性来指定列表的默认值 3.可以通过给option ...

  2. 多项式求值 n维多项式 Horner解法

    #include<iostream> using namespace std; template<class T> T ploy(T *coeff,int n,const T& ...

  3. eclipes个人配置

    设置字体:https://jingyan.baidu.com/article/f96699bb9442f3894e3c1b15.html general->appearance->colo ...

  4. TCP 原理

    一.分组交换网络   古老的电话通信,一根电缆,两个用户设备通信 计算机中的两个设备节点通信:分组网络 计算机网络采取分组交换技术,意思就是我有[一块数据]要发给对方,那我会把这[一块数据]分成N份[ ...

  5. CI框架在控制器中切换读写库和读写库

    CodeIgniter框架版本:3.1.7 ,php版本:5.6.* ,mysql版本:5.6 在Ci框架中,可以在application/config/database.php中配置多个group, ...

  6. java 工具

    JClassLib 4.2 发布了,该版本支持 Java 7 和 Java 8 的类文件属性查看. JClassLib不但是一个字节码阅读器而且还包含一个类库允许开发者读取,修改,写入Java Cla ...

  7. [转帖]CentOS 查看系统信息汇总

    CentOS 查看系统信息汇总 http://blog.itpub.net/15498/viewspace-2637493/ 感觉应该是 centos相关的 改了下名字 日志文件说明 /var/log ...

  8. rpm和yum

    RMP(红帽软件包管理器) RPM有点像Windows系统中的控制面板,会建立统一的数据库文件,详细记录软件信息并能够自动分析依赖关系. YUM(软件仓库)

  9. SQL Server2012中如何通过bak文件还原SQL Server2012数据库

    1 登陆完数据库后,不要新建数据库,直接点击“数据库”然后右击"还原数据库". 2 在"源"选项中选择"设备". 3 选择相应的bak文件并 ...

  10. java & jdk

    java & jdk JDK 下载太慢 & java 12 https://download.oracle.com/otn-pub/java/jdk/12.0.1+12/69cfe15 ...