Filter过滤器

本文介绍了JavaWeb中的Filter组件,包括其在拦截请求、执行通用操作如登录校验和统一编码处理等方面的作用。通过实例展示了如何定义和配置Filter,以及登录拦截器的工作流程。
摘要由CSDN通过智能技术生成

概念:

Filter是Javaweb三大组件(Servlet,Filter,Listener)之一。

过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能。

过滤器一般完成一些通用的操作,比如:登录校验,统一编码处理,敏感字符处理等。

步骤:

定义Filter:定义一个类,实现Filter接口,并重写其所有方法。

配置Feilter:Filter类上加@webFilter 注解,配置拦截器资源路径,引导类上加@ServletComponentScan 开启Serlet组件支持。(因为Filter是javaweb三大组件,并不是spring boot提供的功能)

放行后访问对应资源,资源访问完成后,还会回到Filter中么? 会

如果回到Filter中,是重新执行还是执行放行后的逻辑呢?  执行放行后逻辑

@WebFilter(urlPatterns = "/*")
public class Demofilter implements Filter {
    @Override//初始化方法,只调用一次
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("初始化方法执行了");
    }

    @Override//拦截到请求之后调用,调用多次
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("Demo拦截到了请求...放行前逻辑");
        //放行
        filterChain.doFilter(servletRequest, servletResponse);
        System.out.println("Demo拦截到了请求...放行后逻辑");

    }

    @Override//销毁方法,只调用一次
    public void destroy() {
        System.out.println("销毁方法执行了");
    }
}

拦截路径:

过滤器链:

介绍:一个web应用中,可以配置多个过滤器,这多个过滤器就形成一个过滤器链。

顺序:注解配置的Filter,优先级是按照过滤器类名(字符串)的自然排序。

登录拦截:

@Slf4j
@WebFilter(urlPatterns = "/*")
public class LoginCheckFilter implements Filter {
    @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:{}",url);
        //判断是否是登陆操作
        if(url.contains("login")){
            log.info("登录操作,放行。。。");
            filterChain.doFilter(servletRequest, servletResponse);
            return;
        }
        //获取请求头中的令牌
        String jwt = req.getHeader("token");

        //判断jwt令牌是否存在,如果不存在,返回错误结果(未登录)
        if(!StringUtils.hasLength(jwt)){
            log.info("请求头为空,直接返回未登录的信息");
            Result error = Result.error("NOT_LOGIN");
            //手动转换 对象--json----->阿里巴巴fastJSON
            String notLogin = JSONObject.toJSONString(error);
            resp.getWriter().write(notLogin);//response的方法getwriter输出流,响应给浏览器
            return;
        }

        //解析token,如果解析失败,返回错误结果(未登录)
        try {
            JwtUtils.parseJWT(jwt);//解析jwt令牌不报错,就是解析成功
        } catch (Exception e) {//解析失败
            e.printStackTrace();
            log.info("解析令牌失败,返回错误结果");
            Result error = Result.error("NOT_LOGIN");
            //手动转换 对象--json----->阿里巴巴fastJSON
            String notLogin = JSONObject.toJSONString(error);
            resp.getWriter().write(notLogin);
            return;
        }
        //放行
        log.info("令牌合法,放行");
        filterChain.doFilter(servletRequest, servletResponse);
    }
}

  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值