Filter过滤器的使用创建(检查jwt令牌功能)

141 阅读3分钟

PixPin_2024-09-04_21-52-07.png

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)完结。