分享知识 传递快乐
JavaWeb调用顺序如图:请求客户端请求进来会按照 filter -> servlet -> interceptor -> controllerAdvice -> aspect -> controller的顺序调用。
controller返回也会按照controller -> aspect -> controllerAdvice -> interceptor -> servlet -> filter来依次返回。
由于本人能力有限,对调用链路各层做一下粗略的总结,如有不足的地方,还请留言指正。
Filter
概念
Filter也称之为过滤器,它是Servlet技术中最实用的技术,Web开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。
它主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理。
Filter流程:Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。可以简单的理解为:过滤器是在请求进入容器后,但请求进入servlet之前进行预处理的。请求结束返回同样也是在servlet处理完后,返回给前端之前。
功能
在HttpServletRequest到达 Servlet 之前,拦截客户的HttpServletRequest 。根据需要检查HttpServletRequest,也可以修改HttpServletRequest 头和数据。
在HttpServletResponse到达客户端之前,拦截HttpServletResponse 。根据需要检查HttpServletResponse,也可以修改HttpServletResponse头和数据。
生命周期
过滤器的触发时机是容器后,servlet之前,所以过滤器的doFilter(ServletRequest request, ServletResponse response, FilterChain chain)的入参是ServletRequest ,而不是httpservletrequest。因为过滤器是在httpservlet之前。事实上调用Servlet的doService()方法是在chain.doFilter(request, response);这个方法中进行的。
Servlet
概念
Servlet是什么?Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。通俗的讲,servlet是运行在web服务器如tomcat,jetty这样应用服务器上的一段程序,他可以响应http协议的请求,并且实现用户自己的逻辑,最终将结果返回到用户的客户端(浏览器)
Servlet的运行过程
Servlet程序是由WEB服务器调用,web服务器收到客户端的Servlet访问请求后:
- Web服务器首先检查是否已经装载并创建了该Servlet的实例对象。如果是,则直接执行第4步,否则,执行第2步
- 装载并创建该Servlet的一个实例对象
- 调用Servlet实例对象的init()方法
- 创建一个用于封装HTTP请求消息的HttpServletRequest对象和一个代表HTTP响应消息的HttpServletResponse对象,然后调用Servlet的service()方法并将请求和响应对象作为参数传递进去
- WEB应用程序被停止或重新启动之前,Servlet引擎将卸载Servlet,并在卸载之前调用Servlet的destroy()方法
Interceptor
概念
拦截器是Spring MVC中一个十分重要且应用广泛的内容。拦截器是动态拦截Action调用的对象,它提供了一种机制可以使开发者在一个Action执行的前后执行一段代码,也可以在一个Action执行前阻止其执行,同时也提供了一种可以提取Action中可重用部分代码的方式。在AOP中,拦截器用于在某个方法或者字段被访问之前进行拦截,然后再之前或者之后加入某些操作。
原理
它依赖于web框架,在SpringMVC中就是依赖于SpringMVC框架。在实现上,基于Java的反射机制,属于面向切面编程(AOP)的一种运用。
由于拦截器是基于web框架的调用,因此可以使用Spring的依赖注入(DI)进行一些业务操作,同时一个拦截器实例在一个controller生命周期之内可以多次调用。但是缺点是只能对controller请求进行拦截,对其他的一些比如直接访问静态资源的请求则没办法进行拦截处理。
自定义拦截器的步骤
- 自定义一个实现了Interceptor接口的类,或者继承抽象类AbstractInterceptor。
- 在配置文件中注册定义的拦截器。
- 在需要使用Action中引用上述定义的拦截器,为了方便也可以将拦截器定义为默认的拦截器,这样在不加特殊说明的情况下,所有的Action都被这个拦截器拦截。
ControllerAdvice
ControllerAdvice是一个controller增强器,@ControllerAdvice 是spring 3.2提供的新注解,可以对controller中使用到@RequestMapping注解的一下方法做逻辑处理,用法可分为以下三种:
@ControllerAdvice ,很多初学者可能都没有听说过这个注解,实际上,这是一个非常有用的注解,顾名思义,这是一个增强的 Controller。
使用这个 Controller ,可以实现三个方面的功能:
- 全局异常处理
- 全局数据绑定
- 全局数据预处理
灵活使用这三个功能,可以帮助我们简化很多工作,需要注意的是,这是 SpringMVC 提供的功能,在 Spring Boot 中可以直接使用,下面分别来看。
Aspect
横切关注点的模块化(跨越应用程序多个模块的功能,比如 日志功能),这个关注点实现可能另外横切多个对象。主要作用是把当前类标识为一个切面供容器读取。
Controller
控制器,这个不用多说。如果这个都不懂,小编劝你没事多陪陪家人,想吃啥买啥吧....
—————————
如有不足请留言指正
相互学习,共同进步