vue3-13

token可以是后端api的访问依据,一般绝大多数时候,前端要访问后端的api,后端都要求前端请求需要携带一个有效的token,这个token用于用户的身份校验,通过了校验,后端才会向前端返回数据,进行相应的操作,如果没有通过校验,后端则做其他处理。

之前后端代码并没有对前端请求进行token校验,之前的后端src/main/resources/application.properties的文件


spring.datasource.url=jdbc:mysql://localhost:3306/server?serverTimezone=UTC&allowPublicKeyRetrieval=true
spring.datasource.username=root
spring.datasource.password=1234spring.sql.init.mode=always
spring.sql.init.encoding=UTF-8interceptor.key=abcdefghijklmnopqrstuvwxyz0123456789
#NONE:不拦截
interceptor.mode=NONE
#拦截白名单,因为在登录的时候是没有token的,所以没有进行拦截校验
interceptor.whiteList=/api/loginJwt,/api/loginSessionlogging.level.com.lala.mapper=debug
spring.jackson.default-property-inclusion=non_null
mybatis.configuration.map-underscore-to-camel-case=true

src/main/java/com/lala/controller/LoginInterceptor.java文件

package com.lala.controller;import com.lala.service.SecretKeyService;
import io.jsonwebtoken.ExpiredJwtException;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.MalformedJwtException;
import io.jsonwebtoken.UnsupportedJwtException;
import io.jsonwebtoken.security.SignatureException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.servlet.HandlerInterceptor;import javax.crypto.SecretKey;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.stream.Stream;public class LoginInterceptor implements HandlerInterceptor {@Autowiredprivate SecretKeyService secretKeyService;//@Value将外部的值动态注入到Bean中/*这段代码是Spring框架中的一部分,用于从属性文件中注入值。@Value 注解用于将属性文件中的值注入到字段中。在这个例子中,它试图从属性文件中获取一个名为 interceptor.mode 的值,并把它赋给 InterceptorMode 类型的 interceptorMode 字段。如果没有找到这个属性,那么 InterceptorMode.NONE 将被赋给 interceptorMode。*/@Value("${interceptor.mode}")private final InterceptorMode interceptorMode = InterceptorMode.NONE;@Value("${interceptor.whiteList}")private String[] interceptorWhiteList;@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {//浏览器在跨域的时候,可能发送一个OPTIONS请求,对这个请求不做拦截,或者是白名单的请求也不做拦截if ("OPTIONS".equals(request.getMethod()) ||Stream.of(interceptorWhiteList).anyMatch(p -> p.equals(request.getRequestURI()))) {return true;}switch (interceptorMode) {case JWT -> {String token = request.getHeader("Authorization");System.out.println("token=" + token);if (token == null) {//未携带 tokenthrow new Exception401("未携带 token");}try {SecretKey secretKey = secretKeyService.getSecretKey();//根据secretKey生成tokenJwts.parserBuilder().setSigningKey(secretKey).build().parseClaimsJws(token);} catch (ExpiredJwtException | UnsupportedJwtException | MalformedJwtException | SignatureException |IllegalArgumentException e) {//校验 token 失败throw new Exception401("校验 token 失败");}}case SESSION -> {Object user = request.getSession().getAttribute("user");if (user == null) {//校验 session 失败throw new Exception401("校验 session 失败");}}case NONE -> {return true;}}return true;}enum InterceptorMode {NONE, JWT, SESSION;}
}

修改src/main/resources/application.properties文件

#NONE:不拦截,JWT:拦截JWT,SESSION:拦截SESSION
interceptor.mode=JWT

src/main/java/com/lala/AppForServer4.java文件内容如下

package com.lala;import com.lala.controller.LoginInterceptor;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@SpringBootApplication
public class AppForServer4 implements WebMvcConfigurer {@Beanpublic LoginInterceptor loginInterceptor() {return new LoginInterceptor();}@Overridepublic void addInterceptors(InterceptorRegistry registry) {//拦截以api打头的所有请求registry.addInterceptor(loginInterceptor()).addPathPatterns("/api/**");}@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**").allowedOrigins("http://localhost:7070").allowedMethods("OPTIONS", "GET", "POST", "PUT", "DELETE").allowCredentials(true)//是否发送cookie.allowedHeaders("*").allowedOriginPatterns("*")//意味着任何来源都可以访问该应用.allowCredentials(true);}public static void main(String[] args) {SpringApplication.run(AppForServer4.class, args);}
}

这个时候登录就会做token校验

校验token失败是因为在登录的时候发送了下面的请求

const { runAsync: menu } = useRequest<AxiosRespMenuAndRoute, string[]>((username) => _axios.get(`/api/menu/${username}`), { manual: true })

这个请求没有携带合法的token

登录的时候还发送了另一个请求

const { runAsync: login } = useRequest<AxiosRespToken, LoginDto[]>((dto) => _axios.post('/api/loginJwt', dto), { manual: true })

这个请求在白名单中,被放行了

要在登录的时候携带合法的token,可以在src\api\request.ts文件中添加请求拦截器,在拦截器中可以对请求进行统一的处理,代码如下

import { message } from "ant-design-vue";
import axios from 'axios'  
import {serverToken} from '../router/a6router'
const _axios = axios.create({baseURL: import.meta.env.VITE_BACKEND_BASE_URL,timeout: 10000,headers: {"Content-Type": "application/json",},
});
_axios.interceptors.request.use((config)=>{// 如果登录成功if(serverToken.value){config.headers = {// 因为在登录的时候把token保存在本地存储里面了,可以从这里面获取token的值Authorization: serverToken.value}}return config},(error)=>{// 这里是把异常抛给调用者return Promise.reject(error)}
)
_axios.interceptors.response.use((res) => {if(res.data.message){message.success(res.data.message)}return res;
});
export default _axios

再登陆

登录成功,可以看到admin请求携带了一个Authorization头,里面是token值

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/312365.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【基础】【Python网络爬虫】【2.请求与响应】常用请求报头和常用响应方法

Python网络爬虫基础 爬虫基础请求与相应HTTP/HTTPS 协议HTTP/HTTPS的优缺点HTTP 的缺点HTTPS的优点 请求与响应概述请求请求目标&#xff08;url&#xff09;请求体&#xff08;response&#xff09;常用的请求报头查看请求体&#xff08;requests 模块&#xff09; 响应HTTP响…

[2024区块链开发入门指引] - 比特币运行原理

一份为小白用户准备的免费区块链基础教程 工欲善其事,必先利其器 Web3开发中&#xff0c;各种工具、教程、社区、语言框架.。。。 种类繁多&#xff0c;是否有一个包罗万象的工具专注与Web3开发和相关资讯能毕其功于一役&#xff1f; 参见另一篇博文&#x1f449; 2024最全面…

【Leetcode】1599. 经营摩天轮的最大利润

文章目录 题目思路代码 题目 1599. 经营摩天轮的最大利润题目链接 思路 这道题要求计算在一座摩天轮中最大化利润所需的最小轮转次数。有四个座舱&#xff0c;每个座舱最多容纳四位游客。摩天轮的运转需要支付一定的运行成本 runningCost&#xff0c;同时每位游客登舱需要…

UE4运用C++和框架开发坦克大战教程笔记(十三)(第40~42集)

UE4运用C和框架开发坦克大战教程笔记&#xff08;十三&#xff09;&#xff08;第40~42集&#xff09; 40. 多按键绑定41. 自动生成对象42. 资源模块数据结构测试自动生成对象按资源类型生成对象 40. 多按键绑定 上节课实现了按键绑定系统的 4 种基础绑定&#xff0c;这节课来…

【深度学习:Convolutional Neural Networks】卷积神经网络入门指南

卷积神经网络&#xff08;CNN&#xff09;是深度学习领域最引人注目的成就之一。自从LeCun等人在20世纪90年代初引入以来&#xff0c;CNN在图像处理、视频分析和自然语言处理等领域取得了显著的成就。在这篇博客中&#xff0c;我们将探讨CNN的基本原理、结构和一些实际应用案例…

FA模板制作流程

1、FA模板制作的流程&#xff08;完整复制模板制作&#xff09; 总结&#xff1a; FA完整复制云桌面模板流程&#xff1a; 1、安装一个全新的Windows&#xff0c;挂载并安装tools 2、关闭防火墙、启动administrator本地超管用户 3、挂载FusionAccess_WindowsDesktop_Instal…

YOLOv8改进 | 2023注意力篇 | iRMB倒置残差块注意力机制(轻量化注意力机制)

一、本文介绍 本文给家大家带来的改进机制是iRMB&#xff0c;其是在论文Rethinking Mobile Block for Efficient Attention-based Models种提出&#xff0c;论文提出了一个新的主干网络EMO(后面我也会教大家如何使用该主干&#xff0c;本文先教大家使用该文中提出的注意力机制…

SpringBoot入门指南(学习笔记)

概述 Springboot是Spring的一个子项目&#xff0c;用于快速构建Spring应用程序 入门 ①创建SpringBoot工程 ②编写Controller RestController public class HelloContoller {RequestMapping("/hello")public String hello() {return "hello";} }③运行…

FA组件详解

1、了解FA核心组件以及功能 &#xff08;1&#xff09;TC&#xff08;Thin Client&#xff1a;瘦终端&#xff09;&#xff1a;就是类似于机顶盒的一个小盒子&#xff0c;里面有CPU、内存、USB、MIC、HDMI等接口&#xff0c;可以理解为小型电脑&#xff0c;但是它里面是没有操作…

【k8s】deamonset文件和说明

目录 deamonset的相关命令 deamonset的定义 deamonset的使用场景 deamonset的例子 deamonset字段说明 serviceAccountName DaemonSet的结构及其各个部分的作用 deamonset的相关命令 #查看<name-space>空间内有哪些deamonset kubectl get DaemonSet -n <na…

【STM32】STM32学习笔记-PWM驱动LED呼吸灯 舵机 直流电机(16)

00. 目录 文章目录 00. 目录01. 输出比较相关API1.1 TIM_OC1Init1.2 TIM_OCInitTypeDef结构体1.3 TIM_OCMode1.4 TIM_OutputState1.5 TIM_OutputNState1.6 TIM_OCPolarity1.7 TIM_OCNPolarity1.8 TIM_OCPolarity1.9 TIM_OCNPolarity 02. PWM实现呼吸灯接线图03. PWM实现呼吸灯示…

U4_3 语法分析-自底向上分析-LR0/LR1/SLR分析

文章目录 一、LR分析法1、概念2、流程3、LR分析器结构及分析表构造1&#xff09;结构2&#xff09;一些概念 二、LR(0)分析法1、流程2、分析动作1&#xff09;移近2&#xff09;归约(reduce) 3、总结1&#xff09;LR分析器2&#xff09;构造DFA3&#xff09;构造LR(0)的方法(三…