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切面 可以不像 过滤器以及拦截器 这样针对请求路径来做切面
对直接针对方法来做切面 更加的精确