* ┏┓ ┏┓+ +
* ┏┛┻━━━┛┻┓ + +
* ┃ ┃
* ┃ ━ ┃ ++ + + +
* ████━████ ┃+
* ┃ ┃ +
* ┃ ┻ ┃
* ┃ ┃ + +
* ┗━┓ ┏━┛
* ┃ ┃
* ┃ ┃ + + + +
* ┃ ┃
* ┃ ┃ + 神兽保佑
* ┃ ┃ 代码无bug
* ┃ ┃ +
* ┃ ┗━━━┓ + +
* ┃ ┣┓
* ┃ ┏┛
* ┗┓┓┏━┳┓┏┛ + + + +
* ┃┫┫ ┃┫┫
* ┗┻┛ ┗┻┛+ + + +
Filter过滤器
package com.hqa.filter;
import com.alibaba.fastjson2.JSONObject;
import com.hqa.pojo.Result;
import com.hqa.utils.JwtUtils;
import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;
import java.io.IOException;
@WebFilter(urlPatterns = "/*")
@Slf4j
public class LoginCheckFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
// 1、获取请求url。
String url = request.getRequestURI();
log.info("请求的url: {}", url);
// 2、判断请求url中是否包含login,如果包含,说明是登录操作,放行。
if (url.contains("login")) {
log.info("这是登录操作,放行!");
filterChain.doFilter(request,response);
return;
}
// 3、获取请求头中的令牌(token)。
String jwt = request.getHeader("token");
// 4、判断令牌是否存在,如果不存在,返回错误结果(未登录)。
if (!StringUtils.hasLength(jwt)) {
log.info("请求头token为空,返回未登录的信息");
Result error = Result.error("NOT_LOGIN");
// 手动转换 对象 -- json --> 阿里巴巴
String jsonString = JSONObject.toJSONString(error);
response.getWriter().write(jsonString);
return;
}
// 5、解析token,如果解析失败,返回错误结果(未登录)。
try {
JwtUtils.parseJwt(jwt);
} catch (Exception e) { // jwt令牌解析失败
e.printStackTrace();
log.info("解析token,如果解析失败,返回错误结果(未登录)");
Result error = Result.error("NOT_LOGIN");
// 手动转换 对象 -- json --> 阿里巴巴
String jsonString = JSONObject.toJSONString(error);
response.getWriter().write(jsonString);
return;
}
// 6、放行。
log.info("令牌合法,放行");
filterChain.doFilter(request,response);
}
}