登录功能
没什么好写的,就是LoginController层里面要注入empService的对象
登录校验(重点)
没有校验的情况
没有登录之前,访问数据的网址需要跳转到登录页面。
http是无状态的,处理其他业务时没有判断他是否登录
会话技术
会话:用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束。一次会话可以包含多次请求和响应。
会话跟踪:服务器需要识别多次请求是否来自同一浏览器,以便在同一会话的多次请求间共享数据。
- 客户端会话跟踪技术:cookie
- 服务器会话跟踪技术:session
- 令牌技术
cookie
不能识别c1和c2,在maven pom里面添加依赖
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
<version>4.3.3</version>
</dependency>
优点:http协议中支持的技术
缺点:
- 移动端app无法使用cookie
- 用户可以自己禁用cookie
- 不能跨域:前端和后端ip地址不一样
session
底层基于cookie
优点:存储在服务端,安全
缺点:服务器集群环境下无法使用session
jwt令牌
优点:支持pc和移动端、解决集群环境下的认证问题、减轻服务器端存储压力
jwt令牌可以直接存储用户信息
场景:登录认证
- 登录成功后,生成令牌
- 后续每个请求,都要携带jwt令牌,系统在每次请求处理之前,先校验令牌,通过后再处理
jwt生成
- 引入jjwt依赖
- 调用Jwts完成jwt生成和校验
Jwts.builder()
.signWith(SignatureAlgorithm.HS256, "itheima") //设置签名算法
.setClaims(claims)//自定义内容(载荷)
.setExpiration(new Date(System.currentTimeMillis() + 3600 * 1000))//设置有效期为1h
.compact();
Claims claims = Jwts.parser()
.setSigningKey("itheima")
.parseClaimsJws("eyJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoidG9tIiwiaWQiOjEsImV4cCI6MTcwODQyNDc0N30.OsHQF89smb6VhwkaAWUCHFz2M5Ef8_Z2NMyqTVAyN64")
.getBody();
System.out.println(claims);
只要不一样,或者过期都不能成功解析
登录后下发令牌
令牌生成:登录成功后生成jwt令牌返回给前端
令牌校验:请求到达服务端后,对令牌进行统一拦截、校验
过滤器Filter
过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能
过滤器链:
注解方式配置的filter,优先级按照类首字母的优先级排列
登录校验过滤器
拦截器Interceptor
要有两个东西
* 定义拦截器
* 注册配置拦截器