1.功能简述: 过滤器是Servlet技术的一部分,它是Java EE规范的一部分。 主要用于处理请求和响应的数据流,可以修改请求和响应的头信息、内容等。通常用于日志记录、字符编码、安全检查(如用户登录验证)等。
2.因为是执行登陆,检查jwt令牌的功能,所以不需要注入特定的依赖
3.在springboot工程启动类上写注解@ServletComponentScan启动过滤器Filter
@ServletComponentScan// 使springboot扫描Servlet 组件(如 @WebServlet、@WebFilter 和 @WebListener);启动过滤器Filter中@WebFilter的注解
@SpringBootApplication
public class MubaiTechnologyApplication {
public static void main(String[] args) {
SpringApplication.run(MubaiTechnologyApplication.class, args);
}
}
4.编写一个功能类 ,把过滤器中怎么拦截检查jwt令牌的逻辑实现。
@Slf4j
@WebFilter(urlPatterns = "/*")//指定过滤器拦截哪些路径下的请求:"/*"表示任意所有路径下的请求
public class LoginCheckFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//先把类型转换
HttpServletRequest srt = (HttpServletRequest) servletRequest;
HttpServletResponse sre = (HttpServletResponse) servletResponse;
//1.获取所有请求的路径
String url = srt.getRequestURL().toString();
log.info("获取的路径:{}",url);
//判断路径里面是否有login,也就是判断是不是登陆请求
if (url.contains("login")){
log.info("这个请求是登陆请求,放行!");
//放行操作
filterChain.doFilter(servletRequest,servletResponse);
return;//程序结束
}
//2.不是登陆请求,就获取请求头里面的token(令牌)
String jwt = srt.getHeader("token");
//判断这个请求是否有token,没有就拦截,返回未登录的错误信息
//hasLength 方法检查指定的字符串是否不为 null 且长度大于 0。!是逻辑非运算符,它将布尔表达式的结果取反
//StringUtils.hasLength(jwt):表示如果 jwt 不为 null 且长度大于 0,则返回 true;否则返回 false
//因此,!StringUtils.hasLength(jwt) 的结果是,如果 jwt 为 null 或长度为 0(即 jwt 是空字符串或为 null)
// 则表达式的结果为 true;如果 jwt 有内容(长度大于 0),则结果为 false
if (!StringUtils.hasLength(jwt)){
log.info("表示这个请求没有token,返回未登录错误信息");
Result error = Result.error("NOT_LOGIN");//这个不是JSON格式的error,只是一个result类里面的一个error对象
//手动转换对象--json---->阿里巴巴fastJSON,需要添加maven依赖
//把错误信息转成JSON格式
String jsonString = JSONObject.toJSONString(error);
//再通过响应,把JSON格式的错误信息输出返回给客服端
sre.getWriter().write(jsonString);
return;//程序结束
}
//3.在请求理由token时,再进行token的合法性检查
//解析token,如果解析失败,返回错误结果(未登录)技巧是使用try-catch捕获异常,只要解析token出现了异常,那么token一定就是不符合规范的(不管是改写了token,还是token过期了)
try {
//JwtUtils中的generateJwt方法是静态的,所以不需要生成类的实例对象类调用方法,只需类名加方法名即可调用
JwtUtils.parseJWT(jwt);
} catch (Exception e) {
//e.fillInStackTrace();本身并不会抛出异常,它只是更新了异常对象的堆栈跟踪信息。如果不想结束当前方法的执行,而是希望处理异常后继续执行,可以使用这种方式。
e.fillInStackTrace();
log.info("表示token在解析时出错,返回登陆错误信息");
Result error = Result.error("NOT_LOGIN");
//手动转换对象--json---->阿里巴巴fastJSON,需要添加maven依赖
//把错误信息转成JSON格式
String jsonString = JSONObject.toJSONString(error);
//再通过响应,把JSON格式的错误信息输出返回给客服端
sre.getWriter().write(jsonString);
return;//程序结束
}
//4.全部检查通过,放行
log.info("token合法");
filterChain.doFilter(servletRequest,servletResponse);
}
}
(QwQ)完结。