zoukankan      html  css  js  c++  java
  • SpringBoot+filter+listener+拦截器

    一、过滤器(filter)

       介绍:Filter是Servlet技术中最实用的技术,Web开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。它主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理。使用Filter的完整流程:Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。

      1.SpringBoot默认加载的过滤器

           characterEncodingFilter      

         hiddenHttpMethodFilter

         httpPutFormContentFilter

        requestContextFilter

      2.Filter的优先级

        Ordered.HIGHEST_PRECEDENCE

        Ordered.LOWEST_PRECEDENCE

        地位值意味着更高的优先级,自定义filter避免和默认的filter优先级一样,不然会冲突,注册filter的bean  filterRegistrationBean,同模块里面有默认filter   web---》servlet---》filter

      3.自定义filter

        使用servlet3.0注解进行配置

        启动类中加载@ServletComponenScan,进行扫描

        新建一个filter类,implements Filter,并实现对应的接口

        @WebFilter标记一个类为filter,被spring进行扫描         urlPatterns  匹配规则

    package com.itcast.filter;
    
    import javax.servlet.*;
    import javax.servlet.annotation.WebFilter;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    
    @WebFilter(urlPatterns = "/api/*",filterName = "loginFilter")
    public class LoginFilter implements Filter {
    
        /**
         * 容器加載的時候調用
         * @param filterConfig
         * @throws ServletException
         */
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
            System.out.println("init loginFilter");
        }
    
        /**
         * 请求被拦截的时候调用
         * @param request
         * @param response
         * @param filterChain
         * @throws IOException
         * @throws ServletException
         */
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
            System.out.println("doFilter loginFilter");
            HttpServletRequest request1 = (HttpServletRequest) request;
            HttpServletResponse response1 = (HttpServletResponse) response;
            String username = request1.getParameter("username");
            if ("123".equals(username)){
                filterChain.doFilter(request,response);
            }else {
                response1.sendRedirect("index.html");
                return;
            }
    
        }
    
        /**
         * 容器被销毁的时候调用
         */
        @Override
        public void destroy() {
            System.out.println("destroy loginFilter");
        }
    }
    package com.itcast;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.web.servlet.ServletComponentScan;
    
    @SpringBootApplication
    @ServletComponentScan
    public class springBootAdminT {
    
        public static void main(String[] args) {
            SpringApplication.run(springBootAdminT.class,args);
        }
    }

     二、servlet

    package com.itcast.servlet;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    @WebServlet(name="userServlet" ,urlPatterns = "/v1/api/test/customs")
    public class UserServlet extends HttpServlet {
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            resp.getWriter().println("12345");
            resp.getWriter().flush();
            resp.getWriter().close();
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            super.doPost(req, resp);
        }
    }

     三、Listener(监听器)

      介绍:listener是servlet规范中定义的一种特殊类。用于监听servletContext、HttpSession和servletRequest等域对象的创建和销毁事件。监听域对象的属性发生修改的事件。用于在事件发生前、发生后做一些必要的处理。其主要可用于以下方面:1、统计在线人数和在线用户2、系统启动时加载初始化信息3、统计网站访问量4、记录用户访问路径。

        常用的监听器:servletContextListener             httpSessionListtener              servletRequestListener

        

    package com.itcast.listener;
    
    import javax.servlet.ServletRequestEvent;
    import javax.servlet.ServletRequestListener;
    import javax.servlet.annotation.WebListener;
    
    @WebListener
    public class RequestListener implements ServletRequestListener {
    
        @Override
        public void requestDestroyed(ServletRequestEvent sre) {
            System.out.println("===requestDestroyed===");
        }
    
        @Override
        public void requestInitialized(ServletRequestEvent sre) {
            System.out.println("=====requestInitialized======");
        }
    }

    四、Intecpter(拦截器)

      拦截器: 我们需要对一个类实现HandlerInterceptor接口, 默认会实现其中的三个方法,preHandle,postHandle ,afterCompletion,其中preHandle实在Controller方法调用之前执行,postHandle是在请求处理之后进行调用,但是在视图渲染之前,即Controller方法调用之后执行,afterCompletion方法是在整个请求结束之后被调用,也是在DispatcherServlet渲染了对应识图之后执行,主要用于资源清理工作。路径只有走DispacherServlet,才会被拦截,默认静态资源不会被拦截,拦截器需要注册,一般需要在config中注册该拦截器,才能在项目中使用。

     
    package com.itcast.intecpter;
    
    import org.springframework.boot.logging.LoggingInitializationContext;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
    @Configuration
    public class CustomWebMvcConfigurer implements WebMvcConfigurer {
    
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(new LoginIntercpter()).addPathPatterns("/api2/*/**");
            WebMvcConfigurer.super.addInterceptors(registry);
        }
    }
    package com.itcast.intecpter;
    
    import org.springframework.web.servlet.HandlerInterceptor;
    import org.springframework.web.servlet.ModelAndView;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class LoginIntercpter implements HandlerInterceptor {
    
        /**
         *进入Controller之前
         * @param request
         * @param response
         * @param handler
         * @return
         * @throws Exception
         */
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            System.out.println("LoginIntercpter---------->>>preHandle");
            return true;
        }
    
        /**
         * 调用完Controller之后,视图渲染之前
         * @param request
         * @param response
         * @param handler
         * @param modelAndView
         * @throws Exception
         */
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            System.out.println("LoginIntercpter---------->>>postHandle");
        }
    
        /**
         * 整个完成之后,通常用于资源清理
         * @param request
         * @param response
         * @param handler
         * @param ex
         * @throws Exception
         */
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
            System.out.println("LoginIntercpter---------->>>afterCompletion");
        }
    }

       区别:

    1. 拦截器是基于java的反射机制的,而过滤器是基于函数回调
    2. 过滤器依赖与servlet容器,而拦截器不依赖与servlet容器
    3. 拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用
    4. 拦截器可以访问action上下文、值栈里的对象,而过滤器不能
    5. 在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次

      用途:

      1.过滤器,主要的用途是过滤字符编码、做一些业务逻辑判断等。

      2.监听器,做一些初始化的内容添加工作、设置一些基本的内容、比如一些参数或者是一些固定的对象等等

      3.拦截器,在面向切面编程中应用的,就是在你的service或者一个方法前调用一个方法,或者在方法后调用一个方法。是基于JAVA的反射机制

           

     

    kafka rabbitMq
  • 相关阅读:
    第22章 算法
    第二十一章 数据结构
    mysql 索引
    MySQL 视图
    MySQL 子查询
    MySQL 批量更新数据
    MySQL 默认值
    Spring 整体架构和环境搭建
    python之字符串
    python学习
  • 原文地址:https://www.cnblogs.com/stt101517/p/13033958.html
Copyright © 2011-2022 走看看