MVC拦截器并对请求参数进行处理

294 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第4天,点击查看活动详情

首先如果我们要通过拦截器来实现拦截效果,不可避免的要实现 WebMvcConfigurer,通过Spring的MVC我们可以很方便的实现拦截效果 

启动类

注意的是我们实现的每一个配置都要加上@Configuration以便将它纳入spring,还有我们的Configuration所在路径要在scanBasePackages里,如果 你定义的就在启动类同级,你也可以不定义也能扫描到,

@SpringBootApplication(scanBasePackages = {"com.xxx.myAopDemo"})
public class Application {    
public static void main(String[] args) {        
SpringApplication.run(Application.class,args);   
 }}

我在该配置类中没有实现过多方法,就实现了个拦截器还有个参数解析器,还有异步,静态资源等方法 我这里拦截器注册表addInterceptors添加我定义的拦截器TestInterceptor,/testMain的地址会进入我们的拦截器,其他的不会 下面这里其实就是面试的部分SpringMVC的DispatcherServlet处理执行流程,

@GetMapping("/testMain")
@MyAnnoTest("这是测试的,放过")
public void testMain(@UserInfo AuthParamDto authParamDto, @UserTest AutnTestDto authDto){   
 System.out.println("testMain"+authParamDto.getAppKey());
}

拦截器适配

首先项目启动的时候会将我们定义的MvcConfiguration里的拦截器和参数解析器先加载执行

然后我们调/testMain接口,看会进入我们的TestInterceptor拦截器方法,最先执行的是我们的preHandle方法 在这里我们可以取到注解里的值,也可以取到请求地址,反正request有啥你都可以取,

拦截器

然后判断对于该请求是继续走还是拦截下来,具体可以看图

咦,你看有了拦截器是不是就和我们的 业务逻辑剥开了,一个方法,你就啥也不要管了,妙啊, 如果返回true,那就会执行业务逻辑啦(这里不是Controller方法体逻辑哦,靠后)我上面还有个参数解析器,它得先把我的解析器给执行了。

参数解析器

解析器也有执行顺序如果第一个返回FALSE,它会去第二个再执行,为了测试,我也写了两个解析器(可以看上面的addArgumentResolvers方法),在解析器里我们可以看请求参数是否是某个类型, 决定是否要对他进行处理,

(我这里的两个入参@UserInfo AuthParamDto authParamDto, @UserTest AutnTestDto authDto前者会进入HandleResolveTest方法后者返回FALSE会走HandleTestSecond方法)以便参数变成我们想要的模样,比如入参可以在进来的时候需要进行一系列处理及转换,但是又不想在方法体做,

这样就好使了,又是不废一行代码,不必每次写就能完成的任务 首先进入supportsParameter判断此解析器是否支持给定的方法参数,支持走resolveArgument方法将方法参数解析为给定请求的参数值,具体怎么解析resolveArgument方法的methodParameter 参数,后续会贴上代码,网上也有教程,解析完后return即可,其实这挺绕的,反正我是理解了好久,大概我菜,具体的一些原理可以去捡要点去网上看看别人的博客啥的, 我这算是简单的demo详解吧,入门,入门

我们看下执行流程

执行流程:

请求 ->拦截器 ->执行拦截器的preHandle方法 -> 执行参数解析器(参数可返回)->有AOP执行AOP ->执行Controller方法体->执行AOP的@After注解 -> 执行拦截器的postHandle方法->执行拦截器的afterCompletion(view视图渲染完成后执行)方法

一个简简单单的拦截器加参数设置完成啦

好啦,今天的不开心就止于此吧,明天依旧光芒万丈啊,宝贝!