Spring Boot + JWT + Mybatis Plus搭建通用快速开发模板

本文将从如何创建Spring Boot项目开始讲解如何搭建一个较为通用的快速开发模板,方便在以后的开发中可以快速的应用,做一个高效的cv工程师,避免每次写都要去以前的项目里翻工具类和通用配置。

做高效cv工程师,从搭建自己的常用通用开发模板开始吧,本文的项目源码都放在我的github
上了,有用就给上一个Star

创建一个Spring Boot项目

开发工具使用idea
采用idea中的Spring Initializr创建项目(如果第一次使用下载依赖会比较慢)

  • 选择 Spring Initializr方式构建
    在这里插入图片描述
  • 配合项目名包路径
    在这里插入图片描述
  • 依赖就选择一个web的就可以,需要什么依赖之后手动加入
    在这里插入图片描述
  • 设置项目存放位置,选择自己的工作空间
    在这里插入图片描述
  • 点击finish开始创建,第一次可能会比较久
  • 创建完成后的目录结构
    在这里插入图片描述
  • 修改maven仓库位置,默认创建的是在C盘中的仓库,重新定位到自己的仓库(可不改)
    file - > settings ->搜索maven
    选中自己的本地仓库地址,点击apply
    在这里插入图片描述
    一个Spring Boot的项目就创建好了

基础配置编写

  • 引入常用Maven依赖
		<!--mybatis-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.2</version>
        </dependency>
        <!--mysql驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <!--mybatis-plus-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.3.1.tmp</version>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.3.1.tmp</version>
        </dependency>
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.30</version>
        </dependency>
        <!--模板引擎-->
        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity-engine-core</artifactId>
            <version>2.1</version>
        </dependency>

        <!--guava-->
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>29.0-jre</version>
        </dependency>
        <!-- pagehelper -->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
            <version>1.2.5</version>
        </dependency>
        <!--通用工具包commons-lang3 -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.7</version>
        </dependency>
        <!--数据源-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.10</version>
        </dependency>
        <!--swagger2-->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.8.0</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.8.0</version>
        </dependency>
        <!-- 引入swagger-bootstrap-ui包 -->
        <dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>swagger-bootstrap-ui</artifactId>
            <version>1.8.5</version>
        </dependency>
        <!--热部署-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <!--依赖不传递-->
            <optional>true</optional>
        </dependency>
        <!--jwt-->
        <dependency>
            <groupId>com.auth0</groupId>
            <artifactId>java-jwt</artifactId>
            <version>3.2.0</version>
        </dependency>
  • 创建常用的包
    在这里插入图片描述

  • 配置BasedemoApplication
    BasedemoApplication是整个web项目的启动类
    配置一下mapper接口的扫描

@SpringBootApplication
@MapperScan("com.example.basedemo.dao")
public class BasedemoApplication {
   

    public static void main(String[] args) {
   
        SpringApplication.run(BasedemoApplication.class, args);
    }
}
  • 创建配置文件
    在这里插入图片描述
    默认创建了application.properties
    手动创建开发环境配置:application-dev.properties
    手动创建生产环境配置:application-prov.properties
    application.properties内容:

    spring.profiles.active=dev
    

application-dev.properties和application-prov.properties根据需求自己配置

#端口
server.port = 3036
#xml文件路径
mybatis-plus.mapper-locations=classpath:mapper/*.xml
#数据类连接
spring.datasource.url=jdbc:mysql://localhost:3306/crm?useUnicode=true&characterEncoding=UTF-8&sessionVariables=time_zone='%2B8:00'
spring.datasource.username=root
spring.datasource.password=root
#使用druid数据源
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
#连接驱动
spring.datasource.driver-class-name= com.mysql.cj.jdbc.Driver
        
#时间格式
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=GMT+8

日志配置

Spring Boot默认采用的是SLF4J + LogBack,这也是比较优的一种搭配了,就直接用这个
引入配置文件logback-spring.xml
在这里插入图片描述
日志写入根目录下的log目录,每天生成一个日志文件
具体配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">

    <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
    <property name="LOG_HOME" value="log" />

    <!--控制台日志, 控制台输出 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度,%msg:日志消息,%n是换行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
    </appender>

    <!--文件日志, 按照每天生成日志文件 -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--日志文件输出的文件名-->
            <FileNamePattern>${LOG_HOME}/klchen_summary.log.%d{yyyy-MM-dd}.log</FileNamePattern>
            
  • 7
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,下面是一份使用 Spring BootMyBatis Plus 实现 Token 校验的示例代码: 1. 首先,我们需要在 pom.xml 文件中添加相关依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>${spring.boot.version}</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>${mybatis.plus.version}</version> </dependency> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>${jjwt.version}</version> </dependency> ``` 其中,`${spring.boot.version}`、`${mybatis.plus.version}` 和 `${jjwt.version}` 分别表示 Spring BootMyBatis PlusJWT 的版本号,可以根据需要进行修改。 2. 创建一个 TokenUtils 工具类,用于生成和解析 JWT: ```java public class TokenUtils { private static final String SECRET_KEY = "your_secret_key"; private static final long EXPIRATION_TIME = 86400000L; // token 过期时间为 24 小时 public static String generateToken(User user) { Date now = new Date(); Date expiration = new Date(now.getTime() + EXPIRATION_TIME); return Jwts.builder() .setSubject(user.getUsername()) .claim("userId", user.getId()) .setIssuedAt(now) .setExpiration(expiration) .signWith(SignatureAlgorithm.HS256, SECRET_KEY) .compact(); } public static User parseToken(String token) { Claims claims = Jwts.parser() .setSigningKey(SECRET_KEY) .parseClaimsJws(token) .getBody(); return new User( Long.parseLong(claims.get("userId").toString()), claims.getSubject() ); } } ``` 其中,`generateToken()` 方法用于生成 JWT,`parseToken()` 方法用于解析 JWT。`SECRET_KEY` 是一个字符串,用于签名 JWT,应该保密存储。`EXPIRATION_TIME` 表示 token 的过期时间,这里设置为 24 小时。 3. 创建一个 AuthInterceptor 拦截器,用于拦截需要进行 Token 校验的请求: ```java public class AuthInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String token = request.getHeader("Authorization"); if (token != null && token.startsWith("Bearer ")) { token = token.substring(7); try { User user = TokenUtils.parseToken(token); request.setAttribute("currentUser", user); return true; } catch (Exception e) { response.setStatus(HttpStatus.UNAUTHORIZED.value()); return false; } } else { response.setStatus(HttpStatus.UNAUTHORIZED.value()); return false; } } } ``` 其中,`preHandle()` 方法会在请求到达控制器之前被调用,如果请求头中包含有效的 JWT,则将其解析出来,并将当前用户信息存储到 `HttpServletRequest` 对象中,然后返回 `true`;否则,返回 `false`,并设置响应状态码为 401(未授权)。 4. 在 Spring Boot 的配置类中注册 AuthInterceptor 拦截器: ```java @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new AuthInterceptor()) .addPathPatterns("/api/**") .excludePathPatterns("/api/user/login"); // 登录接口不需要进行 token 校验 } } ``` 其中,`.addPathPatterns("/api/**")` 表示对 `/api` 目录下的所有请求进行拦截,`.excludePathPatterns("/api/user/login")` 表示对 `/api/user/login` 接口不进行拦截。 5. 在控制器中使用 `@CurrentUser` 注解获取当前用户信息: ```java @RestController @RequestMapping("/api/user") public class UserController { @Autowired private UserService userService; @PostMapping("/login") public Result login(@RequestBody LoginRequest request) { User user = userService.login(request.getUsername(), request.getPassword()); String token = TokenUtils.generateToken(user); return Result.success(token); } @GetMapping("/info") public Result getUserInfo(@CurrentUser User user) { return Result.success(user); } } ``` 其中,`@CurrentUser` 注解用于从 `HttpServletRequest` 对象中获取当前用户信息,代码如下: ```java @Target(ElementType.PARAMETER) @Retention(RetentionPolicy.RUNTIME) public @interface CurrentUser { } ``` ```java @ControllerAdvice public class CurrentUserMethodArgumentResolver implements HandlerMethodArgumentResolver { @Override public boolean supportsParameter(MethodParameter parameter) { return parameter.getParameterType().equals(User.class) && parameter.hasParameterAnnotation(CurrentUser.class); } @Override public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception { return webRequest.getAttribute("currentUser", RequestAttributes.SCOPE_REQUEST); } } ``` 需要在 Spring Boot 的配置类中注册 `CurrentUserMethodArgumentResolver` 类: ```java @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) { resolvers.add(new CurrentUserMethodArgumentResolver()); } } ``` 至此,一个简单的使用 Spring BootMyBatis Plus 实现 Token 校验的示例就完成了。当客户端发送请求时,需要在请求头中添加 `Authorization` 字段,值为 `Bearer <token>`,其中 `<token>` 为生成的 JWT。如果 token 校验成功,控制器中的 `@CurrentUser` 参数会自动填充当前用户信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值