ホームページ > 記事 > ウェブフロントエンド > Vue2.0+axios はログインインターセプターを実装します (コード付き)
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 サイトの他の関連記事を参照してください。