From 5527ac4cb7ba6a9ef4d42694733360fb918c85ff Mon Sep 17 00:00:00 2001 From: utchoang Date: Thu, 4 Nov 2021 13:25:09 +0700 Subject: [PATCH 1/2] cancel requests when user logs out --- ui/src/api/index.js | 5 ++++- ui/src/utils/request.js | 18 +++++++++++++++++- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/ui/src/api/index.js b/ui/src/api/index.js index 6c4818ae8058..533d25f2e049 100644 --- a/ui/src/api/index.js +++ b/ui/src/api/index.js @@ -15,7 +15,7 @@ // specific language governing permissions and limitations // under the License. -import { axios } from '@/utils/request' +import { axios, sourceToken } from '@/utils/request' export function api (command, args = {}, method = 'GET', data = {}) { let params = {} @@ -40,6 +40,8 @@ export function api (command, args = {}, method = 'GET', data = {}) { } export function login (arg) { + sourceToken.init() + const params = new URLSearchParams() params.append('command', 'login') params.append('username', arg.username || arg.email) @@ -57,5 +59,6 @@ export function login (arg) { } export function logout () { + sourceToken.cancel() return api('logout') } diff --git a/ui/src/utils/request.js b/ui/src/utils/request.js index 116a17117a6b..796d8327cfd3 100644 --- a/ui/src/utils/request.js +++ b/ui/src/utils/request.js @@ -24,6 +24,7 @@ import { CURRENT_PROJECT } from '@/store/mutation-types' import { i18n } from '@/locales' import store from '@/store' +let source const service = axios.create({ timeout: 600000 }) @@ -81,6 +82,8 @@ const err = (error) => { // request interceptor service.interceptors.request.use(config => { + source = sourceToken.getSource() + config.cancelToken = source.token if (config && config.params) { config.params.response = 'json' const project = Vue.ls.get(CURRENT_PROJECT) @@ -107,7 +110,20 @@ const installer = { } } +const sourceToken = { + init: () => { source = axios.CancelToken.source() }, + getSource: () => { + if (!source) sourceToken.init() + return source + }, + cancel: () => { + if (!source) sourceToken.init() + source.cancel() + } +} + export { installer as VueAxios, - service as axios + service as axios, + sourceToken } From bb22d132d4d27b4d0450cc85786a32932dd0d0b4 Mon Sep 17 00:00:00 2001 From: utchoang Date: Thu, 13 Jan 2022 16:29:45 +0700 Subject: [PATCH 2/2] clear notification, message after logout --- ui/src/api/index.js | 3 +++ ui/src/utils/plugins.js | 13 ++++++++----- ui/src/utils/request.js | 3 +++ 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/ui/src/api/index.js b/ui/src/api/index.js index 533d25f2e049..7cb2edef988e 100644 --- a/ui/src/api/index.js +++ b/ui/src/api/index.js @@ -16,6 +16,7 @@ // under the License. import { axios, sourceToken } from '@/utils/request' +import { message, notification } from 'ant-design-vue' export function api (command, args = {}, method = 'GET', data = {}) { let params = {} @@ -60,5 +61,7 @@ export function login (arg) { export function logout () { sourceToken.cancel() + message.destroy() + notification.destroy() return api('logout') } diff --git a/ui/src/utils/plugins.js b/ui/src/utils/plugins.js index 99db8f7eb6e3..464caef39b54 100644 --- a/ui/src/utils/plugins.js +++ b/ui/src/utils/plugins.js @@ -21,6 +21,7 @@ import { api } from '@/api' import { message, notification } from 'ant-design-vue' import eventBus from '@/config/eventBus' import store from '@/store' +import { sourceToken } from '@/utils/request' export const pollJobPlugin = { install (Vue) { @@ -168,11 +169,13 @@ export const pollJobPlugin = { } }).catch(e => { console.error(`${catchMessage} - ${e}`) - notification.error({ - message: i18n.t('label.error'), - description: catchMessage, - duration: 0 - }) + if (!sourceToken.isCancel(e)) { + notification.error({ + message: i18n.t('label.error'), + description: catchMessage, + duration: 0 + }) + } catchMethod && catchMethod() }) } diff --git a/ui/src/utils/request.js b/ui/src/utils/request.js index 796d8327cfd3..ba4ed6f2fbf0 100644 --- a/ui/src/utils/request.js +++ b/ui/src/utils/request.js @@ -112,6 +112,9 @@ const installer = { const sourceToken = { init: () => { source = axios.CancelToken.source() }, + isCancel: (e) => { + return axios.isCancel(e) + }, getSource: () => { if (!source) sourceToken.init() return source