web-dev-qa-db-ja.com

Vue.jsインターセプター

vue.jsinterceptorを使用するにはどうすればよいですか?したがって、すべての要求/応答の前に、まずインターセプターに移動する必要があります。私はすでに多くのことを検索しましたが、それに関する適切なドキュメントを見つけることができません。

このようなJWTAuthを使用したいと思います。

(function (define) {
  'use strict'

  define(function (require) {

    var interceptor

    interceptor = require('rest/interceptor')

    /**
     * Authenticates the request using JWT Authentication
     *
     * @param {Client} [client] client to wrap
     * @param {Object} config
     *
     * @returns {Client}
     */
    return interceptor({
      request: function (request, config) {
        var token, headers

        token = localStorage.getItem('jwt-token')
        headers = request.headers || (request.headers = {})

        if (token !== null && token !== 'undefined') {
          headers.Authorization = token
        }

        return request
      },
      response: function (response) {
        if (response.status && response.status.code === 401) {
          localStorage.removeItem('jwt-token')
        }
        if (response.headers && response.headers.Authorization) {
          localStorage.setItem('jwt-token', response.headers.Authorization)
        }
        if (response.entity && response.entity.token && response.entity.token.length > 10) {
          localStorage.setItem('jwt-token', 'Bearer ' + response.entity.token)
        }
        return response
      }
    })

  })

}(
  typeof define === 'function' && define.AMD ? define : function (factory) { module.exports = factory(require) }
  // Boilerplate for AMD and Node
))

しかし、私はすべての要求/応答の前に傍受する方法を知りません。 (Laravel 5.2を使用)。

8
Jamie

グローバル構成の例:

Vue.http.interceptors.Push({

  request: function (request){
    request.headers['Authorization'] = auth.getAuthHeader()
    return request
  },

  response: function (response) {
    //console.log('status: ' + response.data)
    return response;
  }

});

requestは送信トラフィック用、responseは受信メッセージ用

vueコンポーネントのローカル構成も可能です。

編集-構文が変更されたため、次のようになります。

Vue.http.interceptors.Push((request, next)  => {
  request.headers['Authorization'] = auth.getAuthHeader()
  next((response) => {
    if(response.status == 401 ) {
      auth.logout();
      router.go('/login?unauthorized=1');
    }
  });
});
20
lukpep

Vue自体にはAJAX=機能がありません。プラグインのvue-resourceについて話しているのですか、それともリクエストに他のライブラリを使用していますか?

vue-resourceサポートにはインターセプターがあります: https://github.com/vuejs/vue-resource/blob/master/docs/http.md (最後のセクションにスクロールダウン)

4
Linus Borg