ホームページ  >  記事  >  ウェブフロントエンド  >  Vue2.0+axios はログインインターセプターを実装します (コード付き)

Vue2.0+axios はログインインターセプターを実装します (コード付き)

php中世界最好的语言
php中世界最好的语言オリジナル
2018-05-15 14:58:542764ブラウズ

vue が 2.0 に更新された後、作者は今後 vue-resource を更新しないと発表しましたが、axios の使用を推奨しました。少し前に、初めてプロジェクトで vue を使用したときのログインの問題について、私の経験をここに書き留めておきます。

最初のバックエンド:

import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import com.lovnx.gateway.po.User;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LoginInterceptor extends HandlerInterceptorAdapter{
  @Override
  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    User user = (User)request.getSession().getAttribute("user");
    if(user == null){
    response.sendError(401);
      return false;
    }else
      return true;
  }
}

ここで行われる処理は次のとおりです。セッションにユーザーがいない場合、401 エラーがフロントエンドに返されます。

フロントエンド:

import Vue from 'vue'
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-default/index.css'
import App from './App'
import router from './router'
import axios from 'axios'
// http response 拦截器
axios.interceptors.response.use(
  response => {
    return response;
  },
  error => {
    if (error.response) {
      if (error.response.status == 401) {
          store.commit(types.LOGOUT);
          router.replace({
            path: 'login',
            query: {redirect: router.currentRoute.fullPath}
          })
      }
    }
    return Promise.reject(error.response.data)  // 返回接口返回的错误信息
  }
);

ここでのインターセプターは main.js で記述されていることに注意してください。

//————————————–分割線————————————–//

もちろん、上記の方法は、Vue プロジェクト内にログイン ページを記述することです。ここでは、Vue プロジェクトと組み合わせて、独立したログイン ページを使用する例を示します。

プロジェクトディレクトリ:

staticとindex.htmlはwebpackでパッケージ化されたものです。

ここでのアイデアは、以前に書いたブログ投稿と組み合わせる必要があります: セッション タイムアウトを実装し、ログイン ページにジャンプするように ajax を書き直す

一般的な考え方は次のとおりです。任意のページをリクエストすると、バックエンド インターセプタがリクエストをインターセプトし、セッション内のユーザー情報が存在するかどうかを確認し、存在しない場合はこの login.html にジャンプし、通常どおりデータに応答します。 。フロントエンドインターセプターへのわずかな変更は次のとおりです:

import Vue from 'vue'
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-default/index.css'
import App from './App'
import router from './router'
import axios from 'axios'
// http response 拦截器
axios.interceptors.response.use(
  response => {
  //这个判断是关键,如果返回登陆页面内容了,就刷新当前页面,经后端处理就会跳转到登陆页面了
  var temp = response.data + "";
      if (temp.indexOf('lkdjoifdgjdfgjdfgjfh14546') > -1) {
        router.go(0);
      }
    return response;
  },
  error => {
    if (error.response) {
      //退出登陆的时候就响应401即可
      if (error.response.status == 401) {
          router.go(0);
      }
    }
    return Promise.reject(error.response.data)  // 返回接口返回的错误信息
  }
);

このうち、lkdjoifdgjdfgjdfgjfh14546 はログインページの隠しフィールドに書かれています。

バックエンドインターセプター:

import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import com.lovnx.gateway.po.User;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LoginInterceptor extends HandlerInterceptorAdapter{
  @Override
  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    String requestUri = request.getRequestURI();
    String contextPath = request.getContextPath();
    if (requestUri.indexOf("/login.html") > -1 || requestUri.indexOf("/system/login") > -1) {
      return true;
    }
    User user = (User)request.getSession().getAttribute("user");
    if(user == null){
      // 未登录跳转到login页面!");
        response.sendRedirect(contextPath + "/login.html");
      return false;
    }else
      return true;
  }
}

この記事の事例を読んだ後は、この方法を習得したと思います。さらに興味深い情報については、PHP 中国語 Web サイトの他の関連記事に注目してください。

以上がVue2.0+axios はログインインターセプターを実装します (コード付き)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。