黑马 javaweb 实现案例
环境搭建
配置文件代码:
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/demo0413
username: root
password: 123456
mybatis:
configuration:
#配置mybatis的日志, 指定输出到控制台
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
#开启mybatis的驼峰命名自动映射开关 a_column ------> aCloumn
map-underscore-to-camel-case: true
实体类的属性:驼峰命名
表结构中的属性:下划线分隔
在 controller 层实现类上加上注解:@RestController
service 层实现类实现 service 接口,并在实现类上加上注解:@Service
mapper 接口上:@Mapper
部门操作
查询部门
删除部门
{id}:路径参数,指传递一个参数值,1、2
@PathVariable:获取请求参数
增加部门
修改部门
部门注解优化
修改员工
登录认证
基础登录功能
登录校验-会话技术-Cookie
会话跟踪:一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一浏览器,以便在同一次会话的多次请求间共享数据。
会话跟踪技术有两种:
-
Cookie(客户端会话跟踪技术):数据存储在客户端浏览器当中
-
Session(服务端会话跟踪技术):数据存储在储在服务端
-
令牌技术
登录校验-会话技术-Session
登录校验-JWT令牌
介绍
生成
引入依赖
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
JwtUtils 代码:
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
import java.util.Map;
public class JwtUtils {
private static String signKey = "itheima";
private static Long expire = 43200000L;
/**
* 生成JWT令牌
* @param claims JWT第二部分负载 payload 中存储的内容
* @return
*/
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;
}
/**
* 解析JWT令牌
* @param jwt JWT令牌
* @return JWT第二部分负载 payload 中存储的内容
*/
public static Claims parseJWT(String jwt){
Claims claims = Jwts.parser()
.setSigningKey(signKey)
.parseClaimsJws(jwt)
.getBody();
return claims;
}
}
controller 层:
@Slf4j
@RestController
public class LoginController {
@Autowired
private EmpService empService;
@PostMapping("/login")
public Result login(@RequestBody Emp emp){
log.info("员工登录"+emp);
Emp e = empService.login(emp);
//登录成功,生成令牌,下发令牌
if (e!=null){
Map<String, Object> claims = new HashMap<>();
claims.put("id",e.getId());
claims.put("name",e.getName());
claims.put("username",e.getUsername());
//生成JWT令牌
String token = JwtUtils.generateJwt(claims);
return Result.success(token);
}
//登录失败,返回错误信息
return Result.error("用户名或密码错误");
}
}
登录校验-过滤器 filter
过滤器中将 Result 类型的数据转换为 JSON 格式:使用 fastJSON 的包
引入依赖:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.76</version>
</dependency>
登录校验-拦截器
拦截器中:
放行:return true
不放行:return false
报错总结
1. 错误500:service 层实现类定义 mapper 接口,没加 @Autowired 注解
4XX:客户端错误
5XX:服务器端错误
快捷键总结
1. ctrl + alt + t:包裹