最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring boot+VUE實現(xiàn)token驗證的示例代碼

 更新時間:2024年10月27日 15:39:03   作者:初夏0811  
本文詳細(xì)介紹了使用Vue和SpringBoot實現(xiàn)token認(rèn)證的方法,包括前后端交互流程、后端依賴導(dǎo)入、token工具類、攔截器、跨域處理、前端路由守衛(wèi)、請求攔截器等內(nèi)容,具有一定的參考價值,感興趣的可以了解一下

一、 步驟

Vue+Spring Boot實現(xiàn)token認(rèn)證主要可分為六步:

1.前端登錄,post用戶名和密碼到后端。

2.后端驗證用戶名和密碼,若通過,生成一個token返回給前端。

3.前端拿到token用vuex和localStorage管理,登錄成功進(jìn)入首頁。

4.之后前端每一次權(quán)限操作如跳轉(zhuǎn)路由,都需要判斷是否存在token,若不存在,跳轉(zhuǎn)至登錄頁。

5.前端之后的每一個對后端的請求都要在請求頭上帶上token,后端查看請求頭是否有token,拿到token檢查是否過期,返回對應(yīng)狀態(tài)給前端。(通常失敗返回401)

6.若token已過期,清除token信息,跳轉(zhuǎn)至登錄頁。

二、后端

1.導(dǎo)依賴

<!--        jwt.token要用到的-->
        <dependency>
            <groupId>com.auth0</groupId>
            <artifactId>java-jwt</artifactId>
            <version>3.4.0</version>
        </dependency>

2.添加token工具類

.withClaim(“Username”, staff.getUsername())
我這個項目沒有用戶密碼,所以我這里只用一個Username,如果有密碼的話可以加多一行,比如說:

.withClaim(“Password”, staff.getPassword())

package com.xfish.employeeManagement.token;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.xfish.employeeManagement.pojo.staff;

import java.util.Date;


public class TokenUtil {
    private static final long EXPIRE_TIME= 10*60*60*1000;   //十小時
    private static final String TOKEN_SECRET="123456";  //密鑰鹽
    /**
     * 簽名生成
     * @param staff
     * @return
     */
    public static String sign(staff staff){
        String token = null;
        try {
            Date expiresAt = new Date(System.currentTimeMillis() + EXPIRE_TIME);
            token = JWT.create()
                    .withIssuer("auth0")
                    .withClaim("Username", staff.getUsername())
//                    .withAudience(staff.getUsername())
                    .withExpiresAt(expiresAt)
                    // 使用了HMAC256加密算法。
                    .sign(Algorithm.HMAC256(TOKEN_SECRET));
        } catch (Exception e){
            e.printStackTrace();
        }
        return token;
    }
    /**
     * 簽名驗證
     * @param token
     * @return
     */
    public static boolean verify(String token){
        try {
            JWTVerifier verifier = JWT.require(Algorithm.HMAC256(TOKEN_SECRET)).withIssuer("auth0").build();
            DecodedJWT jwt = verifier.verify(token);
            System.err.println("認(rèn)證通過:");
            System.err.println("Username: " + jwt.getClaim("Username").asString());
            System.err.println("過期時間:      " + jwt.getExpiresAt());
            return true;
        } catch (Exception e){
            return false;
        }
    }
}

3.添加攔截器

這個攔截器主要的功能就是,把一些沒有token的請求攔截下來并返回錯誤信息,有token就可以直接通過

package com.xfish.employeeManagement.Interceptor;
import com.alibaba.fastjson.JSONObject;
import com.xfish.employeeManagement.token.TokenUtil;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


@Component
public class TokenInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response,Object handler)throws Exception{
        if(request.getMethod().equals("OPTIONS")){
            response.setStatus(HttpServletResponse.SC_OK);
            return true;
        }
        response.setCharacterEncoding("utf-8");
        String token = request.getHeader("token"); //前端vue將token添加在請求頭中
//        System.err.println(request.getHeader());
        if(token != null){
            boolean result = TokenUtil.verify(token);
            if(result){
                System.out.println("通過攔截器");
                return true;
            }
        }
        response.setCharacterEncoding("UTF-8");
        response.setContentType("application/json; charset=utf-8");
        try{
            JSONObject json = new JSONObject();
            json.put("msg","token verify fail");
            json.put("code","50000");
            response.getWriter().append(json.toJSONString());
            System.out.println("認(rèn)證失敗,未通過攔截器");

        }catch (Exception e){
            e.printStackTrace();
            response.sendError(500);
            return false;
        }
        return false;
    }
}

4.配置跨域,并處理請求

注意:這邊攔截的是后端的接口,不是前端的,

在中’ /** ‘無論是restful的,還是后面有一大長串地址都可以識別到

excludePath.add(“/toLogin/**”);

package com.xfish.employeeManagement.config;
import com.xfish.employeeManagement.Interceptor.TokenInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ConcurrentTaskExecutor;
import org.springframework.web.servlet.config.annotation.AsyncSupportConfigurer;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Executors;

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    /**
     * 開啟跨域
     */
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        // 設(shè)置允許跨域的路由
        registry.addMapping("/**")
                // 設(shè)置允許跨域請求的域名
                .allowedOriginPatterns("*")
//                 設(shè)置允許的方法
                .allowedMethods("GET","HEAD","POST","PUT","DELETE","OPTIONS")
                // 是否允許攜帶cookie參數(shù)
                .allowCredentials(true)
                // 設(shè)置允許的方法
                .allowedMethods("*")
                // 跨域允許時間
                .maxAge(4600);
    }


    private TokenInterceptor tokenInterceptor;
    //構(gòu)造方法
    public WebMvcConfig(TokenInterceptor tokenInterceptor){
        this.tokenInterceptor = tokenInterceptor;
    }

    @Override
    public void configureAsyncSupport(AsyncSupportConfigurer configurer){
        configurer.setTaskExecutor(new ConcurrentTaskExecutor(Executors.newFixedThreadPool(3)));
        configurer.setDefaultTimeout(30000);
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        List<String> excludePath = new ArrayList<>();
        //排除攔截,除了注冊登錄(此時還沒token),其他都攔截
//        excludePath.add("");  //登錄
        excludePath.add("/toLogin/**");  //登錄
//        excludePath.add("/admin/login");     //注冊
//        excludePath.add("/**");
        excludePath.add("/img/**");  //靜態(tài)資源
        excludePath.add("/song/**");  //靜態(tài)資源

        registry.addInterceptor(tokenInterceptor)
                .addPathPatterns("/**")
                .excludePathPatterns(excludePath);
        WebMvcConfigurer.super.addInterceptors(registry);
    }

}

5.登錄接口

@GetMapping("/toLogin/{username}")
    public Object toLogin(@PathVariable("username") String username){
        staff staff = staffService.queryStaffDataByName(username);
        JSONObject jsonObject = new JSONObject();
        if(staff!=null){
            String token = TokenUtil.sign(staff);
            jsonObject.put("token",token);
            jsonObject.put("staff",staff);
            jsonObject.put("msg","登錄成功");
            jsonObject.put("code",200);
        }else {
            jsonObject.put("msg","賬號或密碼錯誤");
            jsonObject.put("code",500);
        }
        return jsonObject;
    }

三、前端

1.main.js配置

添加路由前置守衛(wèi)beforeEach攔截請求,2.在axios中添加請求攔截器:

//路由全局前置守衛(wèi)
router.beforeEach((to,from,next) => {
  // if(to.path === '/register' || to.path === '/login' || to.path === '/'){ //若是進(jìn)入登錄與注冊頁面 ==> pass
    if(to.path === '/register' || to.path === '' || to.path === '/'){
    next()
  }else{ 
    let userToken = localStorage.getItem('token');
    // console.log("Token為:"+userToken); 
    if(userToken == null || userToken == ''){
      alert("無權(quán)限,請先登錄!");
      return next('/');
    }else{
      next();
    }
  }
}),


//請求攔截器 在請求頭中加token
axios.interceptors.request.use(
    config => { // 將獲取到的token設(shè)置給header中的token
        if(localStorage.getItem('token')){
            config.headers.token = localStorage.getItem('token');
        }
        return config;
    },
    error => {
        return Promise.reject(error);
    }
)

2.配置Vuex

在配置前記得一定要下載Vuex的依賴

cnpm install vuex --save

vuex的使用方式(可以不看)

store/index.js

import Vue from 'vue'
import Vuex from 'vuex'
 
 Vue.use(Vuex)
 
export default new Vuex.Store({
  state: {
      user: localStorage.getItem('staff') ? localStorage.getItem('staff') : null,
      //若localSorage存在token,將值賦給Vuex.state.token
      token: localStorage.getItem('token') ? localStorage.getItem('token') : null
  },
  mutations: {
      setUsername(state, staff) {
          state.staff = staff
          // JSON.stringify(ary)
          //將staff存成JSON格式
          localStorage.setItem('staff', JSON.stringify(staff))
          
      },
      setToken(state, token) {
          localStorage.setItem('token', token)
          state.token = token
      },
       //我頁面中寫了退出登錄的按鈕所以補了一個logout用來清空localStorage中的數(shù)據(jù)
      logout(state) {
          localStorage.removeItem('token')
          state.token = null
          localStorage.removeItem('staff')
          state.setUsername = null
           //我寫的RSA加密需向后端獲取公鑰,為了方便我在拿到公鑰后直接存入localStorage中,所以在這里也要清空
          localStorage.removeItem('publickey')
          state.publickey=null
          
      }
  }
})

3.登錄方法

記得一定要導(dǎo)包

import store from ‘…/store/index.js’

import store from '../store/index.js'
    export default {
       data() {
         return {
           ruleForm: {     pass: '',    username: ''},
           staff:null,
        }
    },
       methods: {
}
submitForm() {
            var vm=this;
            vm.axios.get('http://localhost:8090/toLogin/'+this.ruleForm.username+''
            ).then(function (response) {
                console.log(response.data.staff)
                if(response.data.code == 200){//將token和user保存到localStorage中
                       store.commit('setToken',response.data.token)
                       store.commit('setUsername',response.data.staff)
                       //跳轉(zhuǎn)到登錄成功后的頁面
                       console.log("========"+response.data.msg)
                       vm.$router.push('/index')
                       //獲取本地存儲中的staff
                       vm.staff=JSON.parse(localStorage.getItem('staff'))
                       console.log(vm.staff);
                       }
                       else{
                         alert(response.data.msg)
                            }    
            }).catch(function (e) {
                console.log(e)
                })
         }

4.退出登錄

退出登錄方法,記得一定要導(dǎo)包

import store from ‘…/store/index.js’

 loginOut(){
          store.commit('logout')  
      }

Spring boot+VUE為什么不用session,
因為session是存在與服務(wù)器的,跨域session是會變的。

到此這篇關(guān)于Spring boot+VUE實現(xiàn)token驗證的示例代碼的文章就介紹到這了,更多相關(guān)Spring boot VUE token驗證內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • spring中的注解@@Transactional失效的場景代碼演示

    spring中的注解@@Transactional失效的場景代碼演示

    這篇文章主要介紹了spring中的注解@@Transactional失效的場景代碼演示,@Transactional注解是Spring框架提供的用于聲明事務(wù)的注解,作用于類和方法上,需要的朋友可以參考下
    2024-01-01
  • Java遠(yuǎn)程執(zhí)行shell命令出現(xiàn)java: command not found問題及解決

    Java遠(yuǎn)程執(zhí)行shell命令出現(xiàn)java: command not found問題及解決

    這篇文章主要介紹了Java遠(yuǎn)程執(zhí)行shell命令出現(xiàn)java: command not found問題及解決方案,具有很好的參考價值,希望對大家有所幫助。
    2023-07-07
  • 關(guān)于mybatis3中@SelectProvider的使用問題

    關(guān)于mybatis3中@SelectProvider的使用問題

    這篇文章主要介紹了mybatis3中@SelectProvider的使用技巧,@SelectProvide指定一個Class及其方法,并且通過調(diào)用Class上的這個方法來獲得sql語句,本文通過實例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2021-12-12
  • Java使用Request獲取請求參數(shù)的通用方式詳解

    Java使用Request獲取請求參數(shù)的通用方式詳解

    這篇文章主要給大家介紹了關(guān)于Java使用Request獲取請求參數(shù)的通用方式,在Java后端開發(fā)中第一步就是獲取前端傳過來的請求參數(shù),文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-01-01
  • Java匯編源碼如何查看環(huán)境搭建

    Java匯編源碼如何查看環(huán)境搭建

    這篇文章主要介紹了如何在IntelliJ IDEA開發(fā)環(huán)境中搭建字節(jié)碼和匯編環(huán)境,以便更好地進(jìn)行代碼調(diào)優(yōu)和JVM學(xué)習(xí),首先,介紹了如何配置IntelliJ IDEA以方便查看Java字節(jié)碼文件,接著,詳細(xì)說明了如何下載和配置HSDIS插件,以便在IDEA中查看Java方法的匯編代碼
    2025-01-01
  • Spring Security 使用 OncePerRequestFilter 過濾器校驗登錄過期、請求日志等操作

    Spring Security 使用 OncePerRequestFilter 

    OncePerRequestFilter是一個過濾器,每個請求都會執(zhí)行一次;一般開發(fā)中主要是做檢查是否已登錄、Token是否過期和授權(quán)等操作,而每個操作都是一個過濾器,下面介紹Spring Security 使用 OncePerRequestFilter 過濾器校驗登錄過期、請求日志等操作方法,感興趣的朋友一起看看吧
    2024-06-06
  • java背包問題動態(tài)規(guī)劃算法分析

    java背包問題動態(tài)規(guī)劃算法分析

    這篇文章主要介紹了java背包問題動態(tài)規(guī)劃算法分析,想了解算法的同學(xué)一定要看一下
    2021-04-04
  • SpringCloud修改OpenFeign的負(fù)載均衡算法的實現(xiàn)步驟

    SpringCloud修改OpenFeign的負(fù)載均衡算法的實現(xiàn)步驟

    本文主要介紹了SpringCloud修改OpenFeign的負(fù)載均衡算法的實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2026-04-04
  • Spring的基礎(chǔ)事務(wù)注解@Transactional作用解讀

    Spring的基礎(chǔ)事務(wù)注解@Transactional作用解讀

    文章介紹了Spring框架中的事務(wù)管理,核心注解@Transactional用于聲明事務(wù),支持傳播機制、隔離級別等配置,結(jié)合@TransactionalEventListener實現(xiàn)事務(wù)事件監(jiān)聽,可在事務(wù)提交后執(zhí)行后續(xù)操作,如郵件通知和日志記錄,通過合理選擇事務(wù)相位和異步處理,提升系統(tǒng)可靠性與解耦性
    2025-09-09
  • java仿百度假分頁代碼實現(xiàn)的詳解

    java仿百度假分頁代碼實現(xiàn)的詳解

    這篇文章主要介紹了java仿百度假分頁代碼實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04

最新評論

永兴县| 县级市| 保山市| 葵青区| 蚌埠市| 华容县| 永清县| 侯马市| 吉安县| 梅州市| 台东县| 蒙自县| 玉溪市| 普兰店市| 湘潭市| 密云县| 博兴县| 浠水县| 邛崃市| 平远县| 腾冲县| 如皋市| 涟源市| 武宣县| 丹阳市| 全州县| 龙江县| 临夏县| 延津县| 高密市| 西城区| 东兴市| 田东县| 邢台市| 茌平县| 壶关县| 龙川县| 咸阳市| 醴陵市| 望谟县| 宁城县|