• Filter(过滤器)Intercerptor(拦截器)


    Filter过滤器

    顾名思义,Filter可以对请求进行过滤,当浏览器发送请求时,首先先会被Filter进行拦截,Filter可以决定此次拦截是否放行,如果选择放行,放行之后还会返回Filter执行剩下的代码。
    在这里插入图片描述

    使用方法:

    1. 创建过滤器类实现Filter接口,注意是jakarta.servlet下的Filter
    2. 在过滤器类上加入@WebFilter(urlPatterns = “/*”),标示类为拦截器类,拦截所有请求。
    3. 在主程序类上加入@ServletComponentScan,程序会扫描Servlet相关的组件(Filter属于javaweb的三大件,不属于Springboot)

    拦截路径:

    /* 拦截所有
    /depts/* 拦截depts/开头的所有

    过滤器链

    当存在多个过滤器时,会形成过滤器链,执行顺序由过滤器的类名决定。放行后会进入下一个过滤器。

    样例代码:登录拦截器

    @WebFilter(urlPatterns = "/*")
    
    public class webFilter implements Filter {
    
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            HttpServletRequest httpServletRequest=(HttpServletRequest) servletRequest;
    
            //假设JWT令牌在请求头中以token存储
            String token = httpServletRequest.getHeader("token");
            if(StringUtils.isEmpty(token)){
                // token为null或长度为0
                servletResponse.getWriter().write("鉴权失败,没有携带token");//这里响应应该返回对象JSON
                return;
            }
            //JWT鉴权
            try {
                Demo.ParseJWT(token);//鉴权
            }catch (Exception e){
                System.out.println("鉴权失败");
                servletResponse.getWriter().write("鉴权失败");//这里响应应该返回对象JSON
                return;
            }
            //鉴权成功,放行
            filterChain.doFilter(servletRequest, servletResponse);
    
            System.out.println("放行返回");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    Interceptor拦截器

    Interceptor是Spring框架的类

    使用方法:

    1. 创建拦截器类,实现HandleInterceptor接口。加上注解@Component
    2. 创建配置类,实现WebMvcConfigurer接口,加上注解@Configuration,标识为配置类。

    拦截路径:

    /* 拦截一级目路径/a /b 不能拦截/a/c
    /** 拦截任意级路径
    /dept/* /dept下的一级路径,不能匹配/dept /dept/a/b
    /dept/** /dept下的任意路径

    执行流程

    浏览器发送请求先被Tomcat中的Filter捕获,放行后再交给Spring环境的DispatcherServlet(前端控制器),由DispatcherServlet转发给Interceptor,最后才到达了Controller。
    所以Filter是比Interceptor先执行的,并且Filter能够拦截所有请求,而Interceptor只能拦截Spring环境下的请求。
    在这里插入图片描述

    拦截器代码实现

    interceptor:

    @Component
    public class LoginInterceptor implements HandlerInterceptor {
        //资源方法运行前运行,返回true则放行,返回false则不放行
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            System.out.println("preHandle");
            return true;
        }
        //资源方法运行后运行
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            System.out.println("post");
            HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
        }
        //视图渲染后运行
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
            HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    配置类:

    @Configuration
    public class Webconfig implements WebMvcConfigurer {
        @Autowired
        LoginInterceptor loginInterceptor;
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(loginInterceptor).addPathPatterns("/**").excludePathPatterns("/login");
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    全局捕获异常

    能够捕获全部未捕获的异常,返回相应的JSON格式错误。

    @RestControllerAdvice
    public class GlobalException {
        @ExceptionHandler(Exception.class)
        public User ex(Exception e){
            return new User();//一旦出现未捕获的异常,返回User类对应的JSON串
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
  • 相关阅读:
    登录模块设计
    大聪明教你学Java | 在支付模块中如何防止掉单和重复支付
    公众号添加菜单总是提示请输入http://或https://开头的公众号相关链接
    flask项目结构与蓝图【心得】
    hexo 使用hexo g -d报错
    【rust/egui】(十一)使用rfd选择文件并使用serde_json进行序列化
    第1章 走近Java【深入理解Java虚拟机:JVM高级特性与最佳实践(第三版)】
    从首届中国测绘地理信息大会,解读2023年度国产GIS创新关键词
    Casbin访问控制框架入门详解及Java案例示范
    期权开户平台:怎样0门槛开户期权,不懂别乱来!
  • 原文地址:https://blog.csdn.net/weixin_44866921/article/details/133777659