使用Servlet中的过滤器实现登录权限验证

发布时间 2023-11-19 13:48:11作者: 生活没有同花顺
{

    /**
     * @description:登录过滤校验
     * @author: lijialuo
     * @date: 2023/11/19 13:28
     * @param: [servletRequest, servletResponse, filterChain]
     * @return: void
     **/
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) servletRequest;
        HttpServletResponse resp = (HttpServletResponse) servletResponse;

        //1.获取请求的url
        String url = req.getRequestURL().toString();
        log.info("请求的路径为:{}",url);
        //2.判断url里面是否为登录的路径 login 如果是则放行
        if (url.contains("login")) {
            log.info("登录请求,放行");
            filterChain.doFilter(req,resp);
            return;
        }
        //3.不是登录路径,验证jwt令牌
        //获取jwt令牌
        String jwt = req.getHeader("token");
        //验证有没有token,如果没有,则返回错误信息
        if (!StringUtils.hasLength(jwt)) {
            //没有token
            log.info("该用户没有登录");
            String noLogin = "false";
            //手动转换 对象->json   ---------->阿里巴巴fastJSON
            String s = JSONObject.toJSONString(noLogin);
            PrintWriter writer = resp.getWriter();
            writer.write(s);
            writer.close();
            return;
        }
        //jwt存在,如果解析失败,返回错误结果(未登录)
        try {
            JwtUtils.parseJWT(jwt);
        } catch (Exception e) {
            e.printStackTrace();
            //解析失败
            log.info("解析令牌失败");
            String noLogin = "false";
            String s = JSONObject.toJSONString(noLogin);
            PrintWriter writer = resp.getWriter();
            writer.write(s);
            writer.close();
            return;
        }

        //放行
        log.info("令牌合法,放行");
        filterChain.doFilter(req,resp);
    }
}