SpringBoot学习
新人第一篇博客,希望每天坚持学习,诸君共勉!
第一天
觉得自己手搓Springboot没什么必要,直接进行初始化Springboot项目觉得简单许多
傻瓜式创建,只要记得进入后修改一下maven配置即可,maven奇怪的一点就是每次创建新项目都要重新配置一下,不知道为什么
首先配置pom文件
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- web依赖-->
<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.3</version>
</dependency>
<!-- mysql-->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
</dependency>
mybatis的使用,以及启动时所需要的几个必须依赖
数据库依赖配置以后
首先配置数据库,写在yml文件中
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mybatis
username: root
password: 888888888
然后写出然后在pojo包中创建实体类
在mapper包中写mapper接口,写出想要使用的mysql以及函数,mysql使用注解的方式来进行查找
@Mapper
public interface UserMapper {
@Select("select * from user where id = #{id}")
public User findById(Integer id);
}
在service包中写出使用的接口,再写出接口的实现类,写在impl包中
实现类中要写出使用的mapper,继承service接口,最后写出返回的结果
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public User findById(Integer id) {
return userMapper.findById(id);
}
}
再再controller包中写出对应的接口
@RestController
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/findById")
public User findById(Integer id){
return userService.findById(id);
}
}
后端正则的使用
public Result login(@Pattern(regexp = "^\\S{5,16}$")String username,@Pattern(regexp = "^\\S{5,16}$") String password){
在传入参数前面加入@Pattern即可进行参数校验,再使用全局异常处理器,即可做到许多if可以做的事情
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public Result handleException(Exception e){
e.printStackTrace();
return Result.error(StringUtils.hasLength(e.getMessage())? e.getMessage() : "操作失败");
}
}
JWT的使用
首先导入pom文件的依赖(还有单元测试的依赖)
<!--java-jwt坐标-->
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>4.3.0</version>
</dependency>
<!-- 单元测试的坐标-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
导入后在test中可以进行单元测试,jwt类似于把用户信息以及传递的报文以及时间全部加密成一个字符串进行传输,保证时效性和安全性
@Test
void testGen(){
Map<String,Object> claims=new HashMap<>();
claims.put("id",1);
claims.put("username","张三");
String token=JWT.create()
.withClaim("user",claims).//添加载荷
withExpiresAt(new Date(System.currentTimeMillis()+1000*60*60*12))//添加过期时间
.sign(Algorithm.HMAC256("qianqiu"));
System.out.println(token);
}
这段代码主要为了生成JWT
@Test
void testParse(){
String token="eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9."
+ "eyJleHAiOjE3MDg1NTc3NjQsInVzZXIiOnsiaWQiOjEsInVzZXJuYW1lIjoi5byg5LiJIn19."
+ "skJhKMobGVU3Z_LjO6x4XeXzlsAY9tDCRzXc4a0WlYw";
JWTVerifier jwtVerifier= JWT.require(Algorithm.HMAC256("qianqiu")).build();
DecodedJWT decodedJWT = jwtVerifier.verify(token);
Map <String , Claim> claims = decodedJWT.getClaims();
System.out.println(claims.get("user"));
}
这是为了通过jwt进行检验
验证token
try {
Map<String, Object> claims = JwtUtil.parseToken(token);
return Result.success("所有的文章内容");
}catch (Exception e){
response.setStatus(401);
return Result.error("未登录");
}
在接口编写时,使用这种方式即可进行jwt验证,如果验证失败返回401,验证成功继续发送
但是如果登陆以后,每个接口都需要使用jwt验证,这就比较繁琐,所以就直接使用拦截器,在每一个接口函数进行之前,先进行jwt验证,在继续函数
拦截器的写法
首先写出这个类(暂时没懂)
@Component
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
//令牌验证
String token = request.getHeader("Authorization");
try {
Map<String, Object> claims = JwtUtil.parseToken(token);
return true;//放行
}catch (Exception e){
response.setStatus(401);
return false;//不放行
}
}
}
再写出这个类,大概意思是出来登录注册,其余接口都需要拦截
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Autowired
private LoginInterceptor loginInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
//登录接口和注册接口不拦截
registry.addInterceptor(loginInterceptor).excludePathPatterns("/user/login","/user/register");
}
}
小结
今天基本上了解了后端开发的流程,controller层主要负责接口函数,调用service层进行实际操作,记得使用service时要@autowried,目前不理解,然后service层中包括接口与实际的impl的接口实现类,然后service层又调用mapper层,mapper层主要负责与数据库进行交互,使用sql语句和函数,sql语句中的参数使用#{XXX}这种格式就可以,pojo是实体类,应该在数据库构建后就进行编写,写出属性可以自动生成剩下的,@Data还挺好用, 然后应该还有一个utils工具包,大概就这样,明天继续!!!