filter过滤器

应用场景:登录校验,统一编码处理,敏感字符处理

  • 记得实现filter接口(注意别导错了包,是javax.servlet包里面的)
  • 记得在启动类加上ServletComponentScan这个注解
  • 总共要重写三个方法,dofilter是核心方法(这个方法每次拦截到请求都会调用,其他的两个类似构造和析构)
  • 记得在这个类上面加webfilter注解,这个括号里面的参数代表拦截怎么样的请求(urlPatterns)

得执行这个放行操作(写在重写的dofilter这个方法里面)    这个方法需要两个参数,一个请求对象,一个响应对象都是重写的dofilter这个方法传过来的(包括filterchain)

filterChain.doFilter(servletRequest,servletResponse);

小细节:执行放行操作前的逻辑会被执行到,执行放行操作后的逻辑也会被执行到

filter拦截路径

过滤器链(过滤器的顺序按照过滤器类名首字母区分,可以看看在包中的排序顺序)

登录校验filter的操作流程

filter登录校验实际操作代码

@Slf4j
@WebFilter(urlPatterns = "/*")//拦截什么样的请求
public class LoginCheckFilter implements Filter {

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//获取对象通过req获取,响应数据通过resp响应

            //获取HttpServletRequest对象可以直接强转形参中的servletRequest
            //因为Tomcat传入的request实际上就是HttpServletRequest 这里是多态的思想
        HttpServletRequest req=(HttpServletRequest)servletRequest;
        HttpServletResponse resp=(HttpServletResponse)servletResponse;
        //1.获取url
        String url = req.getRequestURI().toString();
        log.info("请求的url:{}",url);

        //2.判断url中是否有login这个关键字,如果包含就放行
        if(url.contains("/login")){
            log.info("这是登录操作,放行......");
            filterChain.doFilter(servletRequest,servletResponse);
            return;//直接return,后面不用进行了
        }

        //3.获取请求头中的令牌(token)    注意看接口文档,不同的接口文档的请求头可能不同
        String jwt = req.getHeader("token");//获取请求头

        //4.判断令牌是否存在,如果不存在,返回错误结果(未登录)
            //这个工具类是springframework中提供的工具类
        if(!StringUtils.hasLength(jwt)){//善于使用工具类,这个方法用来判断字符串是否有长度(即字符串为空或者为null)
            log.info("请求头token为空,返回未登录的信息");
                //这里的返回信息也要根据接口文档中的要求来做特定修改
            Result error = Result.error("NOT_LOGIN");

            //因为之前在controller中有RestController可以自动将方法的返回值转为json然后响应回去
            //但是现在我们需要手动转换  对象->json     使用阿里巴巴fastjson工具包(需要引入依赖)
            String notLogin = JSONObject.toJSONString(error);

            //通过resp响应回去,响应给浏览器
            resp.getWriter().write(notLogin);
            return;
        }

        //5.解析token,如果解析失败,返回错误结果(未登录)
        try {//捕获异常,如果jwt令牌解析失败会有异常
            JwtUtils.parseJWT(jwt);
        } catch (Exception e) {
            e.printStackTrace();
            log.info("解析令牌失败,返回未登录信息");

            Result error = Result.error("NOT_LOGIN");
            String notLogin = JSONObject.toJSONString(error);
            resp.getWriter().write(notLogin);
            return;
        }

        //6.正确解析,放行
        log.info("令牌合法,放行");
        filterChain.doFilter(servletRequest,servletResponse);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值