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

2021-04-30  本文已影响0人  _River_
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切面 可以不像 过滤器以及拦截器 这样针对请求路径来做切面
对直接针对方法来做切面 更加的精确 
上一篇下一篇

猜你喜欢

热点阅读