1.2 application.properties配置
#server
server.port= 8888
spring.application.name=mszlu_blog
datasource
spring.datasource.url=jdbc:mysql://localhost:3306/blogxpp?useUnicode=true&characterEncoding=UTF-8&serverTimeZone=UTC
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#mybatis-plus
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
#定义前缀表名,因为数据库中的表带ms_。这样实体类的表不用加前缀就可以匹配
mybatis-plus.global-config.db-config.table-prefix=ms_
1.3 配置分页插件
不知道的可以查看MyBatis-Plus官网关于分页插件的介绍
@Configuration
//扫包,将此包下的接口生成代理实现类,并且注册到spring容器中
@MapperScan(“com.xpp.blog.dao.mapper”)
public class MybatisPlusConfig {
//集成分页插件
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return interceptor;
}
}
1.4 配置解决跨域
解决跨域问题可以参考:SpringBoot解决跨域的5种方式
前后端端口不一样,需要解决跨域问题。
这里解决的方法是重写WebMvcConfigurer
:
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Autowired
private LoginInterceptor loginInterceptor;
//跨域配置,前端和后端端口不一样
@Override
public void addCorsMappings(CorsRegistry registry) {
//8080前端使用的端口号
registry.addMapping(“/**”).allowedOrigins(“http://localhost:8080”);
}
}
1.5 添加启动类
@SpringBootApplication
public class BlogApp {
public static void main(String[] args) {
SpringApplication.run(BlogApp.class,args);
}
}
不管是controller
层还是service
,dao
层,都有可能报异常,如果是预料中的异常,可以直接捕获处理,如果是意料之外的异常,需要统一进行处理,进行记录,并给用户提示相对比较友好的信息。
-
@ControllerAdvice
:对加了@Controller
的方法进行拦截处理,AOP的实现 -
@ExceptionHandler
:统一处理某一类异常,从而减少代码重复率和复杂度,比如要获取自定义异常可以@ExceptionHandler(BusinessException.class)
//作用:对加了@Controller的方法进行拦截处理,AOP的实现
@ControllerAdvice
public class AllExceptionHandler {
//进行一次处理,处理Exception.class的异常
@ExceptionHandler(Exception.class)
//返回json数据,不加的话直接返回页面
@ResponseBody
public Result doException(Exception e){
e.printStackTrace();
return Result.fail(-999,“系统异常”);
}
}
3.1 接口说明
接口url:/login
请求方式:POST
请求参数:
| 参数名称 | 参数类型 | 说明 |
| — | — | — |
| account | string | 账号 |
| password | string | 密码 |
返回数据:
{
“success”: true,
“code”: 200,
“msg”: “success”,
“data”: “token”
}
3.2 JWT
可以参考:JWT整合Springboot
登录使用JWT
技术:
-
jwt 可以生成 一个加密的
token
,做为用户登录的令牌,当用户登录成功之后,发放给客户端。 -
请求需要登录的资源或者接口的时候,将
token
携带,后端验证token
是否合法。
jwt 有三部分组成:A.B.C
-
A:
Header
,{“type”:“JWT”,“alg”:“HS256”} 固定 -
B:
playload
,存放信息,比如,用户id,过期时间等等,可以被解密,不能存放敏感信息 -
C:
签证
,A和B加上秘钥加密而成,只要秘钥不丢失,可以认为是安全的。
jwt 验证,主要就是验证C部分是否合法。
依赖包:
io.jsonwebtoken
jjwt
0.9.1
工具类:
public class JWTUtils {
//密钥
private static final String jwtToken = “123456Mszlu!@#$$”;
//生成token
public static String createToken(Long userId){
Map<String,Object> claims = new HashMap<>();
claims.put(“userId”,userId);
JwtBuilder jwtBuilder = Jwts.builder()
.signWith(SignatureAlgorithm.HS256, jwtToken) // 签发算法,秘钥为jwtToken
.setClaims(claims) // body数据,要唯一,自行设置
.setIssuedAt(new Date()) // 设置签发时间
.setExpiration(new Date(System.currentTimeMillis() + 24 * 60 * 60 * 60 * 1000));// 一天的有效时间
String token = jwtBuilder.compact();
return token;
}
//检查token是否合法
public static Map<String, Object> checkToken(String token){
try {
Jwt parse = Jwts.parser().setSigningKey(jwtToken).parse(token);
return (Map<String, Object>) parse.getBody();
}catch (Exception e){
e.printStackTrace();
}
return null;
}
public static void main(String[] args) {
String token=JWTUtils.createToken(100L);
System.out.println(token);
Map<String, Object> map = JWTUtils.checkToken(token);
System.out.println(map.get(“userId”));
}
}
3.3 Controller
@RestController
@RequestM