Java拦截器

image
(1)浏览器发送一个请求会先到Tomcat的web服务器

(2)Tomcat服务器接收到请求以后,会去判断请求的是静态资源还是动态资源

(3)如果是静态资源,会直接到Tomcat的项目部署目录下去直接访问

(4)如果是动态资源,就需要交给项目的后台代码进行处理

(5)在找到具体的方法之前,我们可以去配置过滤器(可以配置多个),按照顺序进行执行

(6)然后进入到到中央处理器(SpringMVC中的内容),SpringMVC会根据配置的规则进行拦截

(7)如果满足规则,则进行处理,找到其对应的controller类中的方法进行执行,完成后返回结果

(8)如果不满足规则,则不进行处理

(9)这个时候,如果我们需要在每个Controller方法执行的前后添加业务,具体该如何来实现?

这个就是拦截器要做的事。

拦截器(Interceptor)是一种动态拦截方法调用的机制,在SpringMVC中动态拦截控制器方法的执行

作用:

在指定的方法调用前后执行预先设定的代码

阻止原始方法的执行

总结:拦截器就是用来做增强

看完以后,大家会发现

拦截器和过滤器在作用和执行顺序上也很相似

所以这个时候,就有一个问题需要思考:拦截器和过滤器之间的区别是什么?

归属不同:Filter属于Servlet技术,Interceptor属于SpringMVC技术

拦截内容不同:Filter对所有访问进行增强,Interceptor仅针对SpringMVC的访问进行增强
image

让类实现HandlerInterceptor接口,重写接口中的三个方法。

package com.manage.controller.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 ProjectInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afterCompletion");
    }
}

MVC扫描拦截器

注意:拦截器类要被SpringMVC容器扫描到。

package com.manage.config;

import com.manage.controller.interceptor.ProjectInterceptor;
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.WebMvcConfigurationSupport;

import javax.annotation.Resource;

@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {
   @Resource
   private ProjectInterceptor projectInterceptor;

   @Override
   protected void addInterceptors(InterceptorRegistry registry) {
       registry.addInterceptor(projectInterceptor).addPathPatterns("/bank","/bank/*");
   }

   @Override
   public void addResourceHandlers(ResourceHandlerRegistry registry) {
       // 静态资源的映射
       registry.addResourceHandler("/**/*.html").addResourceLocations("/");
       registry.addResourceHandler("/**/*.css").addResourceLocations("/");
       registry.addResourceHandler("/**/*.js").addResourceLocations("/");
       registry.addResourceHandler("/**/*.png").addResourceLocations("/");
       registry.addResourceHandler("/**/*.jpg").addResourceLocations("/");
       registry.addResourceHandler("/lib/**/*.*").addResourceLocations("/lib/");
       registry.addResourceHandler("/**/*.json").addResourceLocations("/");
   }

}

拦截器的执行流程:

image
当有拦截器后,请求会先进入preHandle方法,

​ 如果方法返回true,则放行继续执行后面的handle[controller的方法]和后面的方法

​ 如果返回false,则直接跳过后面方法的执行。

posted @ 2022-10-11 11:24  ajajaz  阅读(86)  评论(0编辑  收藏  举报