指路(1)(2)(3)(4)
黑马程序员JavaWeb开发|案例:tlias智能学习辅助系统(1)准备工作、部门管理_tlias智能学习辅助系统的需求分析-CSDN博客https://blog.csdn.net/YOYU_/article/details/135476566黑马程序员JavaWeb开发|案例:tlias智能学习辅助系统(2)员工管理|分页查询、分页查询(带条件)-CSDN博客https://blog.csdn.net/YOYU_/article/details/135491233黑马程序员JavaWeb开发|案例:tlias智能学习辅助系统(3)员工管理|新增员工、文件上传-CSDN博客https://blog.csdn.net/YOYU_/article/details/135513546
黑马程序员JavaWeb开发|案例:tlias智能学习辅助系统(4)员工管理|修改员工、配置文件-CSDN博客https://blog.csdn.net/YOYU_/article/details/135535512
登录操作的核心逻辑就是按照用户名和密码查询数据库中的内容,如果有则登录成功,如果没有则返回错误信息。
JWT:JSON Web Token
定义了一种简洁、自包含的格式,用于在通信双方以json数据格式安全的传输信息。由于数字签名的存在,这些信息是可靠的。
JSON Web Tokens - jwt.io
Base64 编码/解码 | 菜鸟工具 (runoob.com)
// 生成JWT
@Test
public void testGenJwt(){
Map claims = new HashMap<>();
claims.put("id", 1);
claims.put("name", "tom");
String jwt = Jwts.builder()
.signWith(SignatureAlgorithm.HS256, "itheima")//签名算法
.setClaims(claims)//自定义内容(载荷)
.setExpiration(new Date(System.currentTimeMillis() + 3600 * 1000))//设置有效期为一个小时
.compact();
System.out.println(jwt);
}
// 解析JWT
@Test
public void testParseJwt(){
Claims claim = Jwts.parser()
.setSigningKey("itheima")//指定签名密钥
.parseClaimsJws("eyJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoidG9tIiwiaWQiOjEsImV4cCI6MTcwNTA3MjY3NH0.Yvw1YNjqip8ysiFnKavbaszCMo4zgqjFymwnK15nIJI")
.getBody();//解析令牌
System.out.println(claim);
}
}
F12抓取数据
前端在后续的每一次请求都会携带令牌到服务端
Q:放行后访问对应资源,资源访问完成后,还会回到Filter中吗?会
如果回到Filter中,是重新执行还是执行放行后的逻辑呢?执行放行后的逻辑
package com.itheima.filter;
import com.alibaba.fastjson.JSONObject;
import com.github.pagehelper.BoundSqlInterceptor;
import com.github.pagehelper.util.StringUtil;
import com.itheima.pojo.Result;
import com.itheima.utils.JwtUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* ClassName: LoginCheckFilter
* Package: com.itheima.filter
*/
@Slf4j
@WebFilter(urlPatterns = "/*")
public class LoginCheckFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
//强转为http
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
//1.获取请求url
String url = req.getRequestURL().toString();
log.info("请求的url:{}", url);
//2.判断请求url中是否包含login,如果包含,说明是登录操作,放行
if (url.contains("login")){
log.info("登录操作,放行……");
chain.doFilter(request, response);
return;
}
//3.获取请求头的令牌(token)
String jwt = req.getHeader("token");
//4.判断令牌是否存在,如果不存在,返回错误结果(未登录)
if (!StringUtils.hasLength(jwt)){
log.info("请求头token为空,返回未登录的信息");
Result error = Result.error("NOT_LOGIN");
//手动转换 对象--》json---》阿里巴巴fastJSON工具包
String notlogin = JSONObject.toJSONString(error);
resp.getWriter().write(notlogin);
return;
}
//5.判断token,如果解析失败,返回错误结果(未登录)
try {
JwtUtils.parseJWT(jwt);
} catch (Exception e) {//jwt令牌解析失败
e.printStackTrace();
log.info("解析令牌失败,返回未登录的错误信息");
Result error = Result.error("NOT_LOGIN");
//手动转换 对象--》json---》阿里巴巴fastJSON工具包
String notlogin = JSONObject.toJSONString(error);
resp.getWriter().write(notlogin);
return;
}
//6.放行
log.info("令牌合法,放行");
chain.doFilter(request, response);
}
}
登录请求,直接放行
正确的jwt令牌,查询成功
错误的令牌,解析错误,返回json错误信息
【Filter与Interceptor区别】
退出登录之后,直接复制部门管理链接是无法进入的,拦截需要再次登录。