SpringBoot-Vue 使用 JWT 实现 token 登录验证

  • 所需依赖
        <!--        JWT-->
        <dependency>
            <groupId>com.auth0</groupId>
            <artifactId>java-jwt</artifactId>
            <version>3.10.3</version>
        </dependency>

        <!--        mybatis-plus-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.1</version>
        </dependency>

1.创建 TokenUtils 类 作用:生成token

@Component
public class TokenUtils {
    /**
     * 生成token
     */
    public static String genTonke(String userId, String sign) {
        return JWT.create().withAudience(userId)//将 user id 保存到 token 里面,作为载荷
                .withExpiresAt(DateUtil.offsetHour(new Date(), 2))//2小时后token过期
                .sign(Algorithm.HMAC256(sign));//以 password 作为 token 的密钥
    }

}

2.创建 JWT 拦截器 JwtInterceptor

public class JwtInterceptor implements HandlerInterceptor {
    @Autowired
    private IUserService userService;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String token = request.getHeader("token");
        //如果不是映射到方法直接通过
        if (!(handler instanceof HandlerMethod)){
            return true;
        }
        //执行认证
        if (StrUtil.isBlank(token)){
            throw new ServiceException(AppHttpCodeEnum.NEED_LOGIN.getCode(),"无token,请重新登录");
        }
        //获取token中的userId
        String userId;
        try{
            userId= JWT.decode(token).getAudience().get(0);
        }catch (JWTDecodeException j){
            throw new ServiceException(AppHttpCodeEnum.NEED_LOGIN.getCode(), "token验证失败,请重新登陆");
        }

        //根据token中的userid查询数据库
        User user = userService.getById(Integer.valueOf(userId));
        if (user == null){
            throw new ServiceException(AppHttpCodeEnum.NEED_LOGIN.getCode(),"用户不存在,请重新登陆");
        }

        //用户密码加签验证token
        JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(user.getPassword())).build();
        try{
            jwtVerifier.verify(token);
        }catch (JWTVerificationException e){
            throw new ServiceException(AppHttpCodeEnum.NEED_LOGIN.getCode(),"token验证失败,请重新登陆");
        }

        return true;
    }
}

 3.创建 拦截器 配置类 ItnterceptorConfing

@Configuration
public class ItnterceptorConfing implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {

        registry.addInterceptor(jwtInterceptor())
                .addPathPatterns("/**")  //拦截所有请求,通过判断token是否合法来决定是否需要登录
                .excludePathPatterns("/user/login","/file/*","/user/export","/user/import");//排除特定路径
    }

    //JwtInterceptor 拦截器通过 jwtInterceptor() 方法注册为一个 Spring Bean,所有请求都会经过 JwtInterceptor 进行 JWT 认证检查。
    @Bean
    public JwtInterceptor jwtInterceptor(){
        return new JwtInterceptor();
    }
}

4.在执行登录验证方法时 返回 token 给前端

 @Service
public class UserServiceImpl extends ServiceImpl<UserMapper,User> implements IUserService {

    @Override
    public User login(User user) {
        QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();
        userQueryWrapper.eq("name",user.getName());
        userQueryWrapper.eq("password",user.getPassword());

        //通过前端传过来的值 从数据库中查询到对应的用户对象
        User one = getOne(userQueryWrapper);

        //获取到生成的 token
        String tonke = TokenUtils.genTonke(String.valueOf(one.getId()), one.getPassword());
        if (one!=null){
            BeanUtil.copyProperties(one,user,true);

            //将 tokeng 给到 user对象 ,跟随 user 对象一起返回
            user.setToken(tonke);
            return user;
        }
        return null;
    }
}

5.VUE 前端 在request.js中将 token 配置到请求头

import axios from 'axios'

const request = axios.create({
	baseURL: 'http://localhost:8100',
    timeout: 5000
})

request.interceptors.request.use(config => {
    // 设置请求的Content-Type为application/json;charset=utf-8
    config.headers['Content-Type'] = 'application/json;charset=utf-8';

    // 从localStorage中获取名为"user"的数据,如果存在则解析为JSON对象,否则为null
    let user = localStorage.getItem("user") ? JSON.parse(localStorage.getItem("user")) : null;

    // 如果获取到了用户数据(即user不为null)
    if (user) {
        // 将用户的token添加到请求的header中的token字段
        config.headers['token'] = user.token;
    }

    // 返回经过处理后的config配置对象
    return config;
}, error => {
    // 如果发生错误,将错误传递给下一个处理函数
    return Promise.reject(error);
});


// response 拦截器
// 可以在接口响应后统一处理结果
request.interceptors.response.use(
    response => {
        let res = response.data;
        // 如果是返回的文件
        if (response.config.responseType === 'blob') {
            return res
        }
        // 兼容服务端返回的字符串数据
        if (typeof res === 'string') {
            res = res ? JSON.parse(res) : res
        }
        return res;
    },
    error => {
        console.log('err' + error) // for debug
        return Promise.reject(error)
    }
)


export default request

5.VUE 前端登录方法执行时将响应数据(包含了token)存储到 localStorage 中

handleLogin() {
    // 发送 POST 请求到 "/user/login" 接口,传递 this.form 作为请求体
    this.request.post("/user/login", this.form).then(res => {
        // 请求成功后的处理逻辑
        if (res) {
            // 如果返回的响应对象存在(即登录成功)
            this.$router.push("/main"); // 跳转到 "/main" 路由页面
            this.$message.success("登录成功"); // 显示成功消息
            localStorage.setItem("user", JSON.stringify(res)); // 将响应数据(用户信息)存储到 localStorage 中
        } else {
            // 如果响应对象不存在(即登录失败)
            this.$message.error("账号或密码不正确,登录失败"); // 显示错误消息
        }
    });
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring BootVue.js是两个非常流行的技术栈,可以非常好地实现前后端分离的开发模式。Security和JWT是两个很好的工具,可以帮助我们实现安全的登录和授权机制。 以下是实现Spring BootVue.js前后端分离的步骤: 1.创建Spring Boot工程 首先,我们需要创建一个Spring Boot工程,可以使用Spring Initializr来生成一个基本的Maven项目,添加所需的依赖项,包括Spring Security和JWT。 2.配置Spring Security 在Spring Security中,我们需要定义一个安全配置类,该类将定义我们的安全策略和JWT的配置。在这里,我们可以使用注解来定义我们的安全策略,如@PreAuthorize和@Secured。 3.实现JWT JWT是一种基于令牌的身份验证机制,它使用JSON Web Token来传递安全信息。在我们的应用程序中,我们需要实现JWT的生成和验证机制,以便我们可以安全地登录和授权。 4.配置Vue.js 在Vue.js中,我们需要创建一个Vue.js项目,并使用Vue CLI来安装和配置我们的项目。我们需要使用Vue Router来定义我们的路由,并使用Axios来发送HTTP请求。 5.实现登录和授权 最后,我们需要实现登录和授权机制,以便用户可以安全地登录和访问我们的应用程序。在Vue.js中,我们可以使用Vue Router和Axios来发送HTTP请求,并在Spring Boot使用JWT验证用户身份。 总结 以上是实现Spring BootVue.js前后端分离的步骤,我们可以使用Security和JWT实现安全的登录和授权机制。这种开发模式可以让我们更好地实现前后端分离,提高我们的开发效率和应用程序的安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值