Spring-boot学习笔记
从零开始创建项目
- 先创建一个空的Maven项目,然后在pom.xml引入Spring-boot-starter的父依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.0</version>
</parent>
- 在下面导入web依赖
<dependencies>
<!--Spring-boot-web开发依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
每次导完依赖记得刷新一下
application配置文件
在Resource目录下创建application.yml文件,用于项目的一些基本配置
Spring-boot整合Mybatis
- 导入Mybatis依赖和数据库驱动
<!-- Mybatis依赖-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>3.0.2</version>
</dependency>
<!--数据库驱动-->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
- 在application文件中配置数据库相关信息
spring:
datasource:
url: jdbc:mysql://localhost:3306/test?characterEncoding=utf-8&serverTimezone=UTC
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
数据库url一直到3306,后面test是我自定义的一个数据库,后面是定义字符集,没有定义的话后台数据传输涉及中文可能乱码
- 记得配置一下驼峰命名法
mybatis:
configurations:
map-underscore-to-camel-case: true
Mybatis-plus 遇到类型转化报错
Validation 参数校验
-
引入起步依赖
<!--validation参数校验 依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>
-
在参数前面加@Pattern注解
-
在controller类上加@validated
-
在全局异常处理器中处理 参数校验失败异常 在处理类上加 @RestControllerAdvice
JWT 登录认证
- 导入jwt依赖
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
- 写个jwt工具类
public class JwtUtil {
//有效期为
public static final Long JWT_TTL = 24*60 * 60 *1000L;// 保存一天
//设置秘钥明文
public static final String JWT_KEY = "LiangLjt";//这个密文随便设,八位就好,别多别少
public static String getUUID(){
String token = UUID.randomUUID().toString().replaceAll("-", "");
return token;
}
/**
* 生成jtw
* @param subject token中要存放的数据(json格式)
* @return
*/
public static String createJWT(String subject) {
JwtBuilder builder = getJwtBuilder(subject, null, getUUID());// 设置过期时间
return builder.compact();
}
/**
* 生成jtw
* @param subject token中要存放的数据(json格式)
* @param ttlMillis token超时时间
* @return
*/
public static String createJWT(String subject, Long ttlMillis) {
JwtBuilder builder = getJwtBuilder(subject, ttlMillis, getUUID());// 设置过期时间
return builder.compact();
}
private static JwtBuilder getJwtBuilder(String subject, Long ttlMillis, String uuid) {
SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
SecretKey secretKey = generalKey();
long nowMillis = System.currentTimeMillis();
Date now = new Date(nowMillis);
if(ttlMillis==null){
ttlMillis=JwtUtil.JWT_TTL;
}
long expMillis = nowMillis + ttlMillis;
Date expDate = new Date(expMillis);
return Jwts.builder()
.setId(uuid) //唯一的ID
.setSubject(subject) // 主题 可以是JSON数据
.setIssuer("sg") // 签发者
.setIssuedAt(now) // 签发时间
.signWith(signatureAlgorithm, secretKey) //使用HS256对称加密算法签名, 第二个参数为秘钥
.setExpiration(expDate);
}
/**
* 创建token
* @param id
* @param subject
* @param ttlMillis
* @return
*/
public static String createJWT(String id, String subject, Long ttlMillis) {
JwtBuilder builder = getJwtBuilder(subject, ttlMillis, id);// 设置过期时间
return builder.compact();
}
public static void main(String[] args) throws Exception {
String token = createJWT("LBWNB",(1000*60*60L));
Claims result = parseJWT(token);
System.out.println(result);
}
/**
* 生成加密后的秘钥 secretKey
* @return
*/
public static SecretKey generalKey() {
byte[] encodedKey = Base64.getDecoder().decode(JwtUtil.JWT_KEY);
SecretKey key = new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES");
return key;
}
/**
* 解析
*
* @param jwt
* @return
* @throws Exception
*/
public static Claims parseJWT(String jwt) throws Exception {
SecretKey secretKey = generalKey();
return Jwts.parser()
.setSigningKey(secretKey)
.parseClaimsJws(jwt)
.getBody();
}
}
- 生成jwt报错,可以看看这篇文章 ,导入下面依赖解决
<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>
- 建议深入学习一下 jwt
自定义注解 例子:参数校验
现在Article实体类的status字段只允许 是"已发布" 或者"草稿",通过自定义注解来进行参数校验
- 创建注解类State
@Documented
@Target({ElementType.FIELD}) //指定用于 值
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = {StateValidation.class}) //指定提供校验规则的类
public @interface State {
String message() default "state的参数只能是 发布 | 草稿";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
- 创建自定义参数校验类StateValidation
public class StateValidation implements ConstraintValidator<State,String> {
@Override
public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
//检验Article中的status值是否 是 "已发布" 或者 "草稿"
if(s==null) return false;
return s.equals("已发布") || s.equals("草稿");
}
}
- 之后在哪需要用到就在哪添加@State
- 进一步学习的话可以自己点进某个注解里面了解
Spring-boot集成 Redis
- 导入 Redis 依赖
<!--Redis依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
- 在application.yml文件中配置Redis相关信息,下面是没设密码的redis,如果有还要加密码
spring:
data:
redis:
host: localhost
port: 6379
- 写个测试类 ,测试是否能成功连上redis
@SpringBootTest
public class RedisTest {
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Test
public void testSet()
{
//在redis中存储一个键值对
ValueOperations<String,String> operations = stringRedisTemplate.opsForValue();
operations.set("Lnn","123");//自己设一个键值对
}
}
- 开启Redis服务,然后运行test,然后在Redis客户端中 输入"Lnn"(你设置的value),看能不能获取到"123"(对应key)。
Spring-boot 项目打包
- 在pom.xml加入打包插件,然后刷新一下,之后在maven项目的生命周期那一栏下面 点击package
<build>
<plugins>
<!-- 打包插件 版本最好是跟Spring-boot项目版本保持一致-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>3.2.0</version>
</plugin>
</plugins>
</build>
- 之后就可以看到target目录下有个jar包了,可以在准备工作做好后(数据库服务,redis服务等),在jar包的目录下通过命令行运行(注意你在IDEA的jdk版本可能和本机的jdk版本不同,最好是同一个大版本)
java -jar 包名.jar
标签:return,String,Spring,boot,学习,static,Boot,public,subject
From: https://www.cnblogs.com/LIang2003/p/18047924