IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> JWT(Java Web Token)集成token登录、SpringBoot前后端跨域、Mybatis-plus集成配置 -> 正文阅读

[Java知识库]JWT(Java Web Token)集成token登录、SpringBoot前后端跨域、Mybatis-plus集成配置

JWT(Java Web Token)集成token登录、SpringBoot前后端跨域、Mybatis-plus集成配置

pom

    <!--jwt java web token -->
        <dependency>
            <groupId>com.auth0</groupId>
            <artifactId>java-jwt</artifactId>
            <version>3.10.3</version>
        </dependency>

application.yml单个文件最大上传配置

spring:
  servlet:
    multipart:
      max-file-size: 100MB  #文件上传大小

User

package com.example.springboot.entity;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import jdk.nashorn.internal.parser.Token;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import org.springframework.format.annotation.DateTimeFormat;

/**
 * user
 * @author 
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
@TableName("user")
public class User implements Serializable {

    @TableField(exist = false)
    private Role role;

    @TableField(exist = false)
    private List<Menu> menuList;

    @TableField(exist = false)
    private List<Pet> petList;

    @TableField("role_item_code")
    private String roleItemCode;
    /**
     * 用户id
     */
    @TableId("id")
    private Integer id;

    /**
     * 用户名
     */
    private String username;

    /**
     * 登录密码
     */
    private String password;

    /**
     * 昵称
     */
    private String nickname;

    /**
     * 年龄
     */
    private Integer age;

    /**
     * 性别
     */
    private String gender;

    /**
     * 电话
     */
    private String phone;

    /**
     * 用户邮箱
     */
    private String email;

    /**
     * 详细地址
     */
    private String homeAddressDetail;

    /**
     * 县
     */
    private String homeAddressCountry;

    /**
     * 市区
     */
    private String homeAddressCity;

    /**
     * 省
     */
    private String homeAddressPro;

    /**
     * 头像id
     */
    private Integer fileId;

    /**
     * 角色id
     */
    private Integer roleId;



    /**
     * 创建时间
     */
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date createTime;

    private static final long serialVersionUID = 1L;
}

UserDto.java

package com.example.springboot.controller.dto;

import com.example.springboot.entity.Menu;
import com.example.springboot.entity.Pet;
import com.example.springboot.entity.Role;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import org.springframework.format.annotation.DateTimeFormat;

import java.util.Date;
import java.util.List;

/**
 * @author 廖灵妹
 * @date 2022/3/24 17:18
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class UserDto {
    private String token;

    private Role role;

    private List<Menu> menuList;

    private List<Pet> petList;
    /**
     * 用户id
     */
    private int id;



    /**
     * 用户名
     */
    private String username;

    /**
     * 登录密码
     */
    private String password;

    /**
     * 昵称
     */
    private String nickname;
    /**
     * 年龄
     */
    private Integer age;

    /**
     * 性别
     */
    private String gender;

    /**
     * 电话
     */
    private String phone;

    /**
     * 用户邮箱
     */
    private String email;

    /**
     * 详细地址
     */
    private String homeAddressDetail;

    /**
     * 县
     */
    private String homeAddressCountry;

    /**
     * 市区
     */
    private String homeAddressCity;

    /**
     * 省
     */
    private String homeAddressPro;

    /**
     * 头像id
     */
    private Integer fileId;

    /**
     * 角色id
     */
    private Integer roleId;

    /**
     * 创建时间
     */
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date createTime;



}

InterceptorConfig 拦截器实现类

package com.example.springboot.config.intereptor;
 
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * 拦截器实现类
 * @author 
 * @date 2022/3/24 13:09
 */
@Configuration
public class InterceptorConfig implements WebMvcConfigurer{
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(jwtInterceptor())
            .addPathPatterns("/**")  // 拦截所有请求,通过判断是否有 @LoginRequired 注解 决定是否需要登录
          //  .excludePathPatterns("/user/login","/user/regist","/**/export","/**/import");
                .excludePathPatterns("/**/**");
    }


    /*注入拦截器bean*/
    @Bean
    public JwtInterceptor jwtInterceptor() {
        return new JwtInterceptor();
    }
}

JwtInterceptor .java

package com.example.springboot.config.intereptor;
 
import cn.hutool.core.util.StrUtil;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTDecodeException;
import com.auth0.jwt.exceptions.JWTVerificationException;

import com.example.springboot.Exception.ServiceException;
import com.example.springboot.common.Constant;
import com.example.springboot.entity.User;
import com.example.springboot.service.UserService;
import com.example.springboot.service.impl.UserServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;
 

public class JwtInterceptor implements HandlerInterceptor{
 
    @Autowired
    private UserServiceImpl userService;
 
    @Override
    public boolean preHandle(HttpServletRequest httpServletRequest,
                             HttpServletResponse httpServletResponse,
                             Object object) throws Exception {
        // 从 http 请求头中取出 token
        String token = httpServletRequest.getHeader("token");
        // 如果不是映射到方法直接通过
        if(!(object instanceof HandlerMethod)){
            return true;
        }

        // 执行认证
        if (StrUtil.isBlank(token)) {
            throw new ServiceException(Constant.CODE_401,"无token,请重新登录");
        }
        // 获取 token 中的 user id
        String userId;
        try {
            userId = JWT.decode(token).getAudience().get(0);
        } catch (JWTDecodeException j) {
            throw new ServiceException(Constant.CODE_401,"token验证失败,请重新登录");
        }
        User user = userService.getById(userId);
        if (user == null) {
            throw new ServiceException(Constant.CODE_401,"用户不存在,请重新登录");
        }
        // 通过密码 加签 验证 token
       JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(user.getPassword())).build();
        try {
            //验证token
            jwtVerifier.verify(token);
        } catch (JWTVerificationException e) {
            throw new ServiceException(Constant.CODE_401,"token验证失败,请重新登录");
        }
        return true;
}

}

UserController 登录

 /*登录*/
    @GetMapping("/login")
    public Result selectToLogin(@RequestParam String username  ,@RequestParam String password) {
        UserDto userDto = new UserDto();
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("username" , username);
        queryWrapper.eq("password" ,password );
        if(StrUtil.isBlank(password) || StrUtil.isBlank(username)){
            throw new ServiceException(Constant.CODE_400, "参数错误");
        }
        User one;
        try {
            one = userService.getOne(queryWrapper);
        } catch (Exception e) {
            log.error(e.getMessage());
            throw new ServiceException(Constant.CODE_500, "系统错误,可能存在多个一样账户" );
        }
        if(one!=null){
            BeanUtil.copyProperties(one,userDto,true);
            //设置token
            String token = TokenUtil.getToken(one);
            userDto.setToken(token);

            //获取角色id
            Integer roleId = userDto.getRoleId();
            //设置用户菜单列表
            List<Menu> roleMenuList = userService.getRoleMenuList(roleId);
            userDto.setMenuList(roleMenuList);
            return new Result(Constant.CODE_200, "登录成功", userDto);
        }else {
            throw new ServiceException(Constant.CODE_600, "账号密码错误或用户不存在");
        }

    }

CorsConfig.java Springboot跨域配置类

package com.example.springboot.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
/**
 * @author 
 *  @date 2022/3/9 9:50
 */
@Configuration
public class CorsConfig {

    // 当前跨域请求最大有效时长。这里默认1天
    private static final long MAX_AGE = 24 * 60 * 60;

    @Bean
    public CorsFilter corsFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        corsConfiguration.addAllowedOrigin("*"); // 1 设置访问源地址
        corsConfiguration.addAllowedHeader("*"); // 2 设置访问源请求头
        corsConfiguration.addAllowedMethod("*"); // 3 设置访问源请求方法
        corsConfiguration.setMaxAge(MAX_AGE);
        source.registerCorsConfiguration("/**", corsConfiguration); // 4 对接口配置跨域设置
        return new CorsFilter(source);
    }
}

Mybatis-plus集成

pom

    <!--分页插件MybatisPlus-->
        <!-- MybatisPlus -->
        <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.5.1</version>
    </dependency>

MybatisPlusConfig.java配置类

package com.example.springboot.config;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@EnableTransactionManagement
@Configuration
public class MybatisPlusConfig {

    /**
     * 注册插件
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();

        // 添加分页插件
        PaginationInnerInterceptor pageInterceptor = new PaginationInnerInterceptor();
        // 设置请求的页面大于最大页后操作,true调回到首页,false继续请求。默认false
       // pageInterceptor.setOverflow(false);
        // 单页分页条数限制,默认无限制
       // pageInterceptor.setMaxLimit(500L);
        // 设置数据库类型
        pageInterceptor.setDbType(DbType.MYSQL);
        
        interceptor.addInnerInterceptor(pageInterceptor);
        return interceptor;
    }

}

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-04-06 16:04:04  更:2022-04-06 16:07:56 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 4:47:21-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码