JWT:
1.定义:
JSON Web Token ==> 是一种基于JSON的开放标准用于在各方之间安全传输信息,优于Cookie与Session;
- Cookie:客户端会话技术 -> 缺点:APP不能用,不能跨域
- Session:服务端会话技术,底层基于Cookie -> 分布式环境Session不能共享,会损耗服务器内存
2.组成部分:
由三部分组成:头、载荷、签名;
-
Header:指定令牌类型和签名算法(如
{"alg": "HS256", "typ": "JWT"}) - Payload:携带实际数据(如用户ID、权限、过期时间)
- Signature:对前两部分的签名,用于验证完整性
3.作用:
- 身份认证:用户登录后服务器生成JWT,客户端后续请求携带该令牌
- 安全传输:签名机制防止数据篡改
- 无状态会话:服务端无需存储会话信息(减轻服务器压力)
- 跨域支持:适用于前后端分离架构和微服务间通信
过滤器Filter
地位:
WEB的三大规范接口之一:servlet、Filter、Listener
实现步骤:
1.创建一个类,实现Filter接口,重写抽象方法
2.在类上标记@WebFilter(“要拦截的路径”)
3.启动类加@ServletComponentScan
@WebFilter(urlPatterns = "/*")
public class AuthorizedFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
//1.获取请求路径
String uri = request.getServletPath();
//2.判断当前请求路径是否为登录接口
//3.是就直接放行
if ("/login".equals(uri)) {
chain.doFilter(request, response);
return;
}
//4.不是,获取token
String token = request.getHeader("token");
//5.判断token是否为空
if (StrUtil.isBlank(token)) {
response.setStatus(HttpStatus.HTTP_UNAUTHORIZED);
return;
}
//6.不为空,解析token
try {
Claims claims = JwtUtils.parseJWT(token);
Object id = claims.get("id");
System.out.println(id);
chain.doFilter(request, response);
}catch (Exception e){
response.setStatus(HttpStatus.HTTP_UNAUTHORIZED);
}
}
}
执行流程;
过滤前的代码 –> 放行 –> 过滤后的代码
拦截器Interceptor
成分:
Spring的组件,要实现HandlerInterceptor接口
实现步骤:
1.创建一个类实现HandlerInterceptor接口,重写抽象方法;
2.将拦截器交给spring管理
3.增加一个配置类,实现WebMvcConfigurer,重写addIntercepotr,在内部注册拦截器
@Component
@Slf4j
public class AuthorizedInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//1. 获取请求url。
String url = request.getRequestURL().toString();
//2. 判断请求url中是否包含login,如果包含,说明是登录操作,放行。
if (url.contains("login")) { //登录请求
log.info("登录请求 , 直接放行");
return true;
}
//3. 获取请求头中的令牌(token)。
String jwt = request.getHeader("token");
//4. 判断令牌是否存在,如果不存在,返回错误结果(未登录)。
if (!StringUtils.hasLength(jwt)) { //jwt为空
log.info("获取到jwt令牌为空, 返回错误结果");
response.setStatus(HttpStatus.HTTP_UNAUTHORIZED);
return false;
}
//5. 解析token,如果解析失败,返回错误结果(未登录)。
try {
JwtUtils.parseJWT(jwt);
} catch (Exception e) {
e.printStackTrace();
log.info("解析令牌失败, 返回错误结果");
response.setStatus(HttpStatus.HTTP_UNAUTHORIZED);
return false;
}
//6. 放行。
log.info("令牌合法, 放行");
return true;
}
}
执行流程:
preHandle 方法中的 —> 放行(目标资源)—> postHandle方法 —> afterCompletion方法
文章来源于互联网:初步认识JWT,过滤器与拦截器
相关推荐: 开源项目使用教程:Stable Diffusion v 2.1 web UI
开源项目使用教程:Stable Diffusion v 2.1 web UI stable-diffusion-2-gui Lightweight Stable Diffusion v 2.1 web UI: txt2img, img2img, depth2i…
5bei.cn大模型教程网










