软件编程
位置:首页>> 软件编程>> java编程>> Spring一步到位精通 *

Spring一步到位精通 *

作者:不死鸟.亚历山大.狼崽子  发布时间:2022-01-03 18:31:50 

标签:Spring, ,

1 *

* 是Spring中的概念,和过滤器类似,可以对用户请求进行拦截过滤处理。但是相对于过滤器而言, * 要的控制更加的细节, * 可以在三个地方进行执行:

  • 可以在请求达到Controller控制器之前,通过 * 执行一段代码

  • 也可以在控制器执行之后,通过 * 执行一段代码,此时只是Controller执行完毕视图还没有开始渲染

  • 最后在整个请求结束的时候还可以通过 * 执行一段代码

使用 * 的方法

  • 创建支持它的@Component类,它应该实现HandlerInterceptor接口

  • 实现WebMVCConfigure配置器,注册到spring容器中,添加拦截路径和放行路径

* 和过滤器的区别:

* (Interceptor)类似于Servlet中的过滤器( Filter),它主要用于拦截用户请求并做相应的处理。

  • 过滤器只能在容器初始化时被调用异常,在action的生命周期中,而 * 可以多次被调用。

  • 过滤器可以对几乎所有的请求起作用, * 只能对action请求起作用。

  • 过滤器不能访问action上下文、堆栈里的对象,而 * 可以访问。

  • 过滤器是基于函数回调,而 * 不依赖与servlet容器。

  • 过滤器不能获取IOC容器中的各个bean,而 * 可以,这点很重要,在 * 里注入一个service,可以调用业务逻辑

* 是在DispatcherServlet这个servlet中执行的,因此所有的请求最先进入Filter,最后离开Filter。其顺序如下。

Filter->Interceptor.preHandle->Handler->Interceptor.postHandle->Interceptor.afterCompletion->Filter

2 实现流程

2.1 引入依赖

<dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-web</artifactId>
       </dependency>
       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter</artifactId>
       </dependency>

2.2 自定义 *

package com.example.demo.Interceptor;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Component
public class EasyLogControllerInterceptor implements HandlerInterceptor {
   /**
    * 在controller调用之前执行
    */
   public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
           throws Exception {
       System.out.println(request.getRequestURI()+"开始执行");
       return true;
   }
   /**
    * 在controller调用中执行
    */
   public void postHandle(
           HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
           throws Exception {
       System.out.println(request.getRequestURI()+"执行中");
   }
   /**
    * 在controller调用后执行
    */
   public void afterCompletion(
           HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
           throws Exception {
       System.out.println(request.getRequestURI()+"执行结束");
    }
}

2.3 注入适配器

package com.example.demo.Interceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class IntercepterConfig implements WebMvcConfigurer {
   @Autowired
   private EasyLogControllerInterceptor easyLogControllerInterceptor;
   @Override
   public void addInterceptors(InterceptorRegistry registry) {
       //addPathPatterns用于添加拦截路径
       //excludePathPatterns用于添加不拦截的路径
       registry.addInterceptor(easyLogControllerInterceptor).addPathPatterns("/hello");
   }
   //此方法用于配置静态资源路径
   @Override
   public void addResourceHandlers(ResourceHandlerRegistry registry) {
       registry.addResourceHandler("/**").addResourceLocations("classpath:/my/");
   }
}

执行结果如下:

Spring一步到位精通 *

访问hello接口时,会进入 * ,其他的接口不会进入。

3 控制器验证

多个 * 顺序

  • 多个 * 的执行顺序和注册的顺序有关,先注册的先执行

  • 可以通过Order方法来设置执行顺序,值越小越先执行

来源:https://blog.csdn.net/u013938578/article/details/128644332

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com