SpringBoot中的拦截器和过滤器

Java知识点总结:想看的可以从这里进入

4、拦截器


依赖于web框架,在SpringMVC中就是依赖于SpringMVC框架。在实现上基于Java的反射机制,属于面向切面编程(AOP)的一种运用。由于拦截器是基于web框架的调用,拦截器可以调用IOC容器中的各种依赖,而过滤器不能,因此可以使用Spring的依赖注入进行一些业务操作,同时一个拦截器实例在一个controller生命周期之内可以多次调用。主要应用于登陆校验、权限验证、乱码解决、性能监控和异常处理等功能,但是缺点是只能对controller请求进行拦截,对其他的一些比如直接访问静态资源的请求则没办法进行拦截处理。

在 Spring Boot 项目中,使用拦截器功能通常需要以下 3 步:

  1. 带入相关依赖:spring-boot-starter-web 启动器会引入相关依赖

  2. 创建一个登录拦截器实现 HandlerInterceptor接口,让在访问规定页面时用户必须登录

    返回值类型 方法声明 描述
    boolean preHandle® 在控制器处理请求方法前执行,其返回值表示是否中断后续操作,返回 true 表示继续向下执行,返回 false 表示中断后续操作。
    void postHandle() 在控制器处理请求方法调用之后、解析视图之前执行,可以通过此方法对请求域中的模型和视图做进一步修改。
    void afterCompletion() 该方法在视图渲染结束后执行,可以通过此方法实现资源清理、记录日志信息等工作。
    @Slf4j
    public class MyLoginInterceptor implements HandlerInterceptor {
          
          
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
          
          
           	Object loginUser = request.getSession().getAttribute("loginUser");
            if (loginUser == null) {
          
          
                //未登录,返回登陆页
                request.setAttribute("msg", "您没有权限进行此操作,请先登陆!");
                request.getRequestDispatcher("/login.html").forward(request, response);
                return false;
            } else {
          
          
                //放行
                return true;
            }
        }
    
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
          
          
            log.info("======在方法处理完逻辑,渲染视图之前执行========");
        }
    
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
          
          
            log.info("======在视图渲染完之后执行,用于资源清理等等=======");
        }
    }
    
  3. 注册拦截器,指定拦截规则(如果是拦截所有,静态资源也会被拦截)。

    @Configuration
    @Slf4j
    public class InterseptorConfig implements WebMvcConfigurer {
          
          
    
        @Bean
        public  MyLoginInterceptor myLoginInterceptor(){
          
          
            return new MyLoginInterceptor();
        }
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
          
          
            log.info("注册拦截器");
            registry.addInterceptor(myInterseptor())
                    .addPathPatterns(      //拦截的路径,
                		//拦截所有请求,包括静态资源文件
                		new LoginInterceptor()).addPathPatterns("/**") 
            		)
                    .excludePathPatterns(       //不拦截的路径,静态资源、登录等
                       "/", "/login", "/index.html", "/user/login", "/css/**", "/images/**", "/js/**", "/fonts/**"
                    );
        }
    }
    

5、过滤器


5.1、介绍

Filter:过滤器,JavaWeb 的三大组件之一。属于JavaEE 的规范,是javax.servlet.Filter接口。
过滤器的主要作用是:拦截请求、过滤响应。常见的应用场景为:权限检查、日记操作、处理不合法数据,统一进行编码设置…等。

SpringBoot是利用@WebFilter配置Filter

  • @WebFilter常用属性

    属性 类型 是否必需 说明
    asyncSupported boolean 指定Filter是否支持异步模式
    dispatcherTypes DispatcherType[] 指定Filter对哪种方式的请求进行过滤。 支持的属性:ASYNC、ERROR、FORWARD、INCLUDE、REQUEST; 默认过滤所有方式的请求
    filterName String Filter名称
    initParams WebInitParam[] 配置参数
    displayName String Filter显示名
    servletNames String[] 指定对哪些Servlet进行过滤
    urlPatterns/value String[] 两个属性作用相同,指定拦截的路径

    过滤器的urlPatterns的过滤路径规则:

    1.全路径匹配: /abc/myServlet1.do

    2.部分路径匹配: /abc/*

    3.通配符匹配 :/*

    4.后缀名匹配 :*.do

  • @Order(1) //指定过滤器的执行顺序,值越大越靠后执行

5.2、使用

  • 创建过滤器

    @Slf4j
    //声明是一个过滤器,需要过滤"/login/* 下的所有接口"
    @WebFilter(urlPatterns = "/login/*",filterName = "MyFilter")
    @Order(1)   //指定过滤器的执行顺序,值越大越靠后执行
    public class MyFilter implements Filter {
          
          
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
          
          
            log.info("=====Filter初始化=====");
        }
    
        //执行过滤的规则
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
          
          
            //过滤编码
            request.setCharacterEncoding("utf-8");
            response.setContentType("text/html;charset=utf-8");
    
            //获取请求的一些参数
            HttpServletRequest httpServletRequest = (HttpServletRequest) request;
            String uri = httpServletRequest.getRequestURI();
            String method = httpServletRequest.getMethod();
            log.info("请求的接口{},请求的方式{}",uri,method);
    
            //放行的作用,如果没有,程序会卡在这步,不能继续执行
            chain.doFilter(request,response);
        }
        @Override
        public void destroy() {
          
          
            log.info("=====Filter被销毁=====");
        }
    }
    
  • 在springboot启动类上添加注解:@ServletComponentScan

    @SpringBootApplication
    @EnableScheduling   //开启对定时任务的支持
    @ServletComponentScan  //Servlet、Filter、Listener可以直接通过@WebServlet、@WebFilter、@WebListener注解自动注册,无需其他代码。
    public class SpringbootdemoApplication {
          
          
        public static void main(String[] args) {
          
          
            SpringApplication.run(SpringbootdemoApplication.class, args);
        }
    }
    
  • 先进入filter

    image-20210908122639458

猜你喜欢

转载自blog.csdn.net/yuandfeng/article/details/129728136