天天看点

JavaWeb调用顺序

分享知识 传递快乐

JavaWeb调用顺序如图:请求客户端请求进来会按照 filter -> servlet -> interceptor -> controllerAdvice -> aspect -> controller的顺序调用。

JavaWeb调用顺序

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程序一样,Filter的创建和销毁由WEB服务器负责。
 * web 应用程序启动时,web 服务器将创建Filter 的实例对象,并调用其init方法,读取web.xml配置,完成对象的初始化功能,从而为后续的用户请求作好拦截的准备工作(filter对象只会创建一次,init方法也只会执行一次)。
 * 开发人员通过init方法的参数,可获得代表当前filter配置信息的FilterConfig对象。
 */
public void init(FilterConfig filterConfig) throws ServletException;

/**
 * 拦截请求
 *
 * 这个方法完成实际的过滤操作。当客户请求访问与过滤器关联的URL的时候,Servlet过滤器将先执行doFilter方法。FilterChain参数用于访问后续过滤器。
 */
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException;

/**
 * 销毁
 * 
 * Filter对象创建后会驻留在内存,当web应用移除或服务器停止时才销毁。在Web容器卸载 Filter 对象之前被调用。
 * 该方法在Filter的生命周期中仅执行一次。在这个方法中,可以释放过滤器使用的资源。
 */
public void destroy();      

Servlet

概念

Servlet是什么?Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。通俗的讲,servlet是运行在web服务器如tomcat,jetty这样应用服务器上的一段程序,他可以响应http协议的请求,并且实现用户自己的逻辑,最终将结果返回到用户的客户端(浏览器)

Servlet的运行过程

Servlet程序是由WEB服务器调用,web服务器收到客户端的Servlet访问请求后:

  1. Web服务器首先检查是否已经装载并创建了该Servlet的实例对象。如果是,则直接执行第4步,否则,执行第2步
  2. 装载并创建该Servlet的一个实例对象
  3. 调用Servlet实例对象的init()方法
  4. 创建一个用于封装HTTP请求消息的HttpServletRequest对象和一个代表HTTP响应消息的HttpServletResponse对象,然后调用Servlet的service()方法并将请求和响应对象作为参数传递进去
  5. WEB应用程序被停止或重新启动之前,Servlet引擎将卸载Servlet,并在卸载之前调用Servlet的destroy()方法

Interceptor

概念

拦截器是Spring MVC中一个十分重要且应用广泛的内容。拦截器是动态拦截Action调用的对象,它提供了一种机制可以使开发者在一个Action执行的前后执行一段代码,也可以在一个Action执行前阻止其执行,同时也提供了一种可以提取Action中可重用部分代码的方式。在AOP中,拦截器用于在某个方法或者字段被访问之前进行拦截,然后再之前或者之后加入某些操作。

原理

它依赖于web框架,在SpringMVC中就是依赖于SpringMVC框架。在实现上,基于Java的反射机制,属于面向切面编程(AOP)的一种运用。

由于拦截器是基于web框架的调用,因此可以使用Spring的依赖注入(DI)进行一些业务操作,同时一个拦截器实例在一个controller生命周期之内可以多次调用。但是缺点是只能对controller请求进行拦截,对其他的一些比如直接访问静态资源的请求则没办法进行拦截处理。

自定义拦截器的步骤

  1. 自定义一个实现了Interceptor接口的类,或者继承抽象类AbstractInterceptor。
  2. 在配置文件中注册定义的拦截器。
  3. 在需要使用Action中引用上述定义的拦截器,为了方便也可以将拦截器定义为默认的拦截器,这样在不加特殊说明的情况下,所有的Action都被这个拦截器拦截。

ControllerAdvice

ControllerAdvice是一个controller增强器,@ControllerAdvice 是spring 3.2提供的新注解,可以对controller中使用到@RequestMapping注解的一下方法做逻辑处理,用法可分为以下三种:

@ControllerAdvice ,很多初学者可能都没有听说过这个注解,实际上,这是一个非常有用的注解,顾名思义,这是一个增强的 Controller。

使用这个 Controller ,可以实现三个方面的功能:

  • 全局异常处理
  • 全局数据绑定
  • 全局数据预处理

灵活使用这三个功能,可以帮助我们简化很多工作,需要注意的是,这是 SpringMVC 提供的功能,在 Spring Boot 中可以直接使用,下面分别来看。

Aspect

Controller

继续阅读