springboot项目的完整创建过程以及基本配置

该文详细介绍了创建SpringBoot项目的过程,包括选择依赖、配置数据库连接、Mybatis日志显示、文件上传与下载设置、邮箱配置。同时,文章还涵盖了POM.xml中各项依赖的添加,如SpringBoot启动、Mybatis、MySQL、Lombok等。此外,还讨论了跨域配置、JWT令牌的生成与解析、自定义状态码、统一响应类以及全局异常处理和拦截器的实现。最后提到了服务层自定义异常和拦截器配置类的使用。
摘要由CSDN通过智能技术生成

1.创建springboot项目

 2. 选择依赖

 3. application.properties 的配置

## 连接池源
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
## 数据库连接url
spring.datasource.url=jdbc:mysql://localhost:3306/ghosn2
## 用户名
spring.datasource.username=root
## 密码
spring.datasource.password=123456
## mybatis操作日志显示
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
## 驼峰命名和下划线的对应问题解决
mybatis.configuration.map-underscore-to-camel-case=true
## 文件上传的上传大小设置
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=100MB
## 文件上传的保存地址
file.upload.path=D:/vscode/ghosn/src/assets/static/upload/
## 端口号
server.port=8080
## 文件下载地址
url=http://localhost:8080/file/download/
#邮箱
## stmp标识
spring.mail.host=smtp.qq.com
## qq号
spring.mail.username=qq号
## 授权码
spring.mail.password=授权码
## 端口号
spring.mail.port=465 
## ssl加密验证
spring.mail.properties.mail.smtp.ssl.enable=true
spring.mail.properties.mail.smtp.ssl.trust=smtp.qq.com

4. pom.xml的依赖配置

        ## springboot启动依赖
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        ## Mybatis启动依赖
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>3.0.2</version>
        </dependency>
        ## MySQL启动依赖
        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <scope>runtime</scope>
        </dependency>
        ## 实体类工具
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        ## springboot测试依赖
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        ## jwt令牌依赖
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.9.1</version>
        </dependency>
        ## json操作
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>2.0.25</version>
        </dependency>
        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>2.3.0</version>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-impl</artifactId>
            <version>2.3.0</version>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-core</artifactId>
            <version>2.3.0</version>
        </dependency>
        <dependency>
            <groupId>javax.activation</groupId>
            <artifactId>activation</artifactId>
            <version>1.1.1</version>
        </dependency>
        ## 好用的工具包
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.16</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>4.1.2</version>
        </dependency>
        ## 切面编程AOP
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
        ## 单元测试
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.platform</groupId>
            <artifactId>junit-platform-launcher</artifactId>
            <scope>test</scope>
        </dependency>
        ## 邮箱
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>

5. 跨域配置

package com.ghosn.utils;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * 跨域配置类
 */
@Configuration
public class CoreUtils implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        //项目中的所有接口都支持跨域
        registry.addMapping("/**")
                //所有地址都可以访问,也可以配置具体地址
                .allowedOrigins("*")
                //允许的请求方式
                .allowedMethods("POST", "GET", "PUT", "OPTIONS", "DELETE")
                //是否支持跨域Cookie
//                .allowCredentials(true)
                // 跨域允许时间
                .maxAge(3600);
    }
}

6.jwt的配置

package com.ghosn.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.util.Date;
import java.util.Map;

/**
 * jwt的生成和解析
 */
public class JwtUtils {
    private static final String signKey = "ghosn";
    private static final Long expire = 43200000L;

    public static String generateJwt(Map<String, Object> claims){
        String jwt = Jwts.builder()
                .addClaims(claims)
                .signWith(SignatureAlgorithm.HS256, signKey)
                .setExpiration(new Date(System.currentTimeMillis()+expire))
                .compact();

        return jwt;
    }

    public static Claims parseJwt(String jwt) {
        Claims claims = Jwts.parser()
              .setSigningKey(signKey)
              .parseClaimsJws(jwt)
              .getBody();
        return claims;
    }
}

7.状态码自定义类

package com.ghosn.config;

/**
 * 错误状态码的设置接口
 */
public interface Constants {
    String CODE_200 = "200"; //成功
    String CODE_400 = "400"; //服务端请求错误
    String CODE_405 = "405"; //服务端请求方式错误
    String CODE_302 = "302"; //查询错误

    String CODE_401 = "401"; //权限不足
    String CODE_402 = "402"; //验证失败
    String CODE_404 = "404"; //未找到相关页面
    String CODE_500 = "500"; //系统错误
    String CODE_503 = "503"; //服务不可用
}

8.统一相应类的配置

package com.ghosn.utils;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;

/**
 * 统一的返回数据类
 */
@Data
@Slf4j
@AllArgsConstructor
@NoArgsConstructor
public class Result {
    private String code;
    private String msg;
    private Object data;

    public static Result success(Object data) {
        return new Result("200",null,data);
    }
    public static Result success(String msg,Object data) {
        return new Result("200",msg,data);
    }
    public static Result success(String msg) {
        return new Result("200",msg,null);
    }
    public static Result success() {
        return new Result("200",null,null);
    }
    public static Result error(String code, String msg, Object data) {
        return new Result(code, msg, data);
    }
    public static Result error(String code, String msg) {
        return new Result(code, msg, null);
    }

}

9.全局异常配置类

package com.ghosn.utils;

import com.ghosn.config.Constants;
import com.ghosn.exception.ServiceException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/**
 * 自定义全局异常
 */
@RestControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(ServiceException.class)
    public Result handle(ServiceException se) {
        return Result.error(se.getCode(), se.getMessage());
    }
}

10.服务层自定义异常类

package com.ghosn.exception;

import lombok.Getter;

/**
 * 服务层自定义异常的实现
 */
@Getter
public class ServiceException extends RuntimeException{
    private String code;

    public ServiceException(String code, String msg){
        super(msg);
        this.code = code;
    }
}

11.拦截器的配置类

package com.ghosn.config;

import com.ghosn.Interceptor.LoginCheckInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * 拦截器的设置类
 */
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
    @Autowired
    private LoginCheckInterceptor loginCheckInterceptor;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(loginCheckInterceptor).addPathPatterns("/**")
                .excludePathPatterns("/*/export","/*/import","/file/upload/**","/file/download/**","/user/login","/user/register","/error/**");

    }
}

12.拦截器的实现类

package com.ghosn.Interceptor;

import com.alibaba.fastjson.JSONObject;
import com.ghosn.config.Constants;
import com.ghosn.exception.ServiceException;
import com.ghosn.utils.JwtUtils;
import com.ghosn.utils.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpMethod;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

@Component
@Slf4j
public class LoginCheckInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String url = request.getRequestURI().toString();
        if(!(handler instanceof HandlerMethod)){
            return true;
        }
        if(HttpMethod.OPTIONS.toString().equals(request.getMethod())){
            return true;
        }
        if (url.contains("/login")) {
            log.info("登录接口请求,放行...");
            return true;
        }
        String jwt = request.getHeader("token");
        if (!StringUtils.hasLength(jwt)) {
            log.info("请求头token为空,返回重新登录...");
            throw new ServiceException(Constants.CODE_401, "非法进入,请登录后操作!");
        }
        try {
            JwtUtils.parseJwt(jwt);
        } catch (Exception e) {
            e.printStackTrace();
            log.info("解析令牌错误,返回未登录信息!");
            throw new ServiceException(Constants.CODE_401, "错误登录,返回重新登录!");
        }
        log.info("令牌合法,放行...");
        return true;
    }
}

后面就是数据接口的撰写。祝大家学业有成!

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值