美文网首页
1(AOP):Servlet 与 过滤器和拦截器(熟悉概念即可

1(AOP):Servlet 与 过滤器和拦截器(熟悉概念即可

作者: _River_ | 来源:发表于2021-04-30 21:24 被阅读0次
    1:HTTP请求时在 Servlet Tomcat 流程图
    2:Servlet  与 过滤器和拦截器 概念图    
    3:对于过滤器和拦截器的区别(应用场景)
    
    1:HTTP请求时在 Servlet Tomcat 流程图
    在一个应用程序中,每种Servlet类型只能有一个实例。
    
    当用户调用需要用某个类型的一个 Servlet实例时:
        如果该Servlet类型的实例  不存在   就会加载并创建一个该Servlet类型实例
        如果该Servlet类型的实例  已存在   就会直接使用该Servlet类型实例
        如果该Servlet类型          找不到   就会使用默认的Servlet实例 响应状态码404 
    
    回忆一下以前我们Servlet的原生XML映射
    1:HTTP请求 请求到XML文件  
    2:XML文件  再映射到对应的类的方法
    那么假如找不到这个Servlet类型   这个类的这个方法本身就不存在呢  响应的状态码为404
    
    那么现在我们就可以认为:   
    这个类的这个方法就是可以代表一个Servlet了
    假如找不到指定的Servlet类型就使用默认的Servlet实例(返回状态码404)
    
    Servlet的实例生成的两种方式:
    1:Servlet的实例在第一次被调用是产生(默认)
    2:服务启动时创建(可配置)
    
    1:浏览器发起HTTP请求
    
    2:HTTP请求到达Tomcat容器
    3:此时对应的Servlet的还没有被初始化
    4:Tomcat加载磁盘中的Servlet到 Servlet容器中
    5:Servlet加载成功
    
    6:Tomcat解析HTTP请求 成Request
    7:Tomcat转发Request到  Servlet
    8:Servlet处理完后返回Response
    9:Tomcat解析Response 成HTTP响应
    
    10:HTTP响应回到客户端
    
    2:Servlet 与 过滤器和拦截器 概念图
    3:对于过滤器和拦截器的区别(应用场景)
    过滤器(Filter):当你有一堆东西的时候,你只希望选择符合你要求的某一些东西。
    拦截器(Interceptor):在一个流程正在进行的时候,你希望干预它的进展,甚至终止它进行。
    
    过滤器:只想要在一堆黑白芝麻  里面  选红芝麻! (不应该改变对象,如把黑芝麻,白芝麻变红芝麻)
    拦截器:把水流变小点!把鱼都拦住!顺便发个电!(改变对象,对这个对象有读写的权限)
    
    4:过滤器 与 拦截器 SpringMVC
    1:过滤器
    过滤器是JavaEE标准,采用函数回调的方式进行。
    是在请求进入Servlet容器之后,还未进入Servlet实例之前进行预处理,
    并且在请求结束返回给前端这之间进行后期处理。
      
     Filter对用户请求进行预处理,接着将请求交给Servlet进行预处理并生成响应,最后Filter再对服务器响应进行后处理。
    
    chain.doFilter(request, response);这个方法的调用作为分水岭。
    事实上调用Servlet的doService()方法  就是在拦截器的chain.doFilter(request, response) 中进行的。
    
    @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            System.out.println("before...");
            chain.doFilter(request, response);
            System.out.println("after...");
        }
    
    2:拦截器
    拦截器是在Servlet实例里面 也就是被包裹在过滤器之中的
    
        @Override
        //在过滤器的chain.doFilter(request, response)方法的前一步执行
        //也就是在 [System.out.println("before...")][chain.doFilter(request, response)]之间执行。
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            System.out.println("preHandle");
            return true;
        }
    
        @Override
       //Controller逻辑之后,在return ModelAndView之前进行,可以操控Controller的ModelAndView内容。
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            System.out.println("postHandle");
        }
    
        @Override
         //afterCompletion()方法是在过滤器返回给前端前一步执行
        //也就是在[chain.doFilter(request, response)][System.out.println("after...")]之间执行。
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
            System.out.println("afterCompletion");
        }
    
    3:SpringMVC
    SpringMVC的机制是由同一个Servlet来分发请求给不同的Controller,其实这一步是在Servlet的service()方法中执行的。
    
    6:过滤器和拦截器的对比总结
    相同点:
        都是针对请求路径进行处理
       
    使用范围不同:
    1:规范 与 应用  范围
        过滤器是依赖于Servlet容器,属于Servlet规范的一部分,应用范围只能用于Web程序    
        拦截器是Spring容器内的,是Spring框架锁支持 ,可以Web程序,也可以用其他程序。
     
    2:使用资源
        过滤器只能针对请求进来的servletRequest以及响应出去的servletResponse进行处理,无法对Spring的IOC容器的bean进行处理。
        过滤器执行由Servlet容器回调完成
        
        拦截器是Spring的一个组件,也归Spring管理,可以获取IOC容器中的各个bean,在拦截器里注入一个service,可以调用业务逻辑。
        拦截器通常通过动态代理的方式来执行。
        
    3:深度不同
        过滤器只能在Servlet前后起作用
        拦截器可以深入到方法前 因此拦截器使用具有更大的弹性。
      
    建议
            拦截器 处理 请求日志 token
            过滤器处理其他
    
    7:过滤器与拦截器建议使用场景
    过滤器的应用范围只能在Servlet前后 顾名思义只做过滤 不做本身数据上的修改
    
    1:执行完dofilter的前操作
        进行多重过滤
        过滤器1:过滤是否为白名单
        
        过滤器2:过滤请求是否正确
        httpServletRequest.getParameter("usernName");
        
        过滤器3:过滤token是否正常    
        httpServletRequest.getHeader("Authorization");
    
    2:dofilter(执行Controller层逻辑)    
    
    3:执行完dofilter的后续处理
    

    拦截器,可以几乎用在所有的地方,很多时候会修改本身的数据。
    
    8:Aspect切面(简单了解)
    Aspect切面 可以不像 过滤器以及拦截器 这样针对请求路径来做切面
    对直接针对方法来做切面 更加的精确 
    

    相关文章

      网友评论

          本文标题:1(AOP):Servlet 与 过滤器和拦截器(熟悉概念即可

          本文链接:https://www.haomeiwen.com/subject/zpjorltx.html