[SpringMVC]拦截器①(概述、入门案例)

网友投稿 241 2022-11-30

[SpringMVC]拦截器①(概述、入门案例)

文章目录

​​什么是拦截器​​​​拦截器入门案例​​

​​环境准备​​​​拦截器开发​​

​​步骤1:创建拦截器类​​​​步骤2:配置拦截器类​​​​步骤3:SpringMVC添加SpringMvcSupport包扫描​​​​步骤4:运行程序测试​​​​步骤5:修改拦截器拦截规则​​

​​简化SpringMvcSupport的编写​​​​总结​​

什么是拦截器

讲解拦截器的概念之前,我们先看一张图:

(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的访问进行增强

拦截器入门案例

环境准备

创建一个Web的Maven项目pom.xml添加SSM整合所需jar包

创建模型类Book

public class Book { private String name; private double price; public String getName() { return name; } public void setName(String name) { this.name = name; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } @Override public String toString() { return "Book{" + "书名='" + name + '\'' + ", 价格=" + price + '}'; }}

编写Controller

@RestController@RequestMapping("/books")public class BookController { @PostMapping public String save(@RequestBody Book book){ System.out.println("book save..." + book); return "{'module':'book save'}"; } @DeleteMapping("/{id}") public String delete(@PathVariable Integer id){ System.out.println("book delete..." + id); return "{'module':'book delete'}"; } @PutMapping public String update(@RequestBody Book book){ System.out.println("book update..."+book); return "{'module':'book update'}"; } @GetMapping("/{id}") public String getById(@PathVariable Integer id){ System.out.println("book getById..."+id); return "{'module':'book getById'}"; } @GetMapping public String getAll(){ System.out.println("book getAll..."); return "{'module':'book getAll'}"; }}

拦截器开发

步骤1:创建拦截器类

我们可以创建一个拦截器文件夹,命名为interceptor,这个文件夹我们可以把它放在controller文件夹中,因为拦截器本来就与表现层有关。然后我们再在拦截器文件夹中创建一个拦截器类ProjectInterceptor:

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

@Component//定义拦截器类,实现HandlerInterceptor接口//注意当前类必须受Spring容器控制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..."); }}

注意:拦截器类要被SpringMVC容器扫描到。拦截器中的​​preHandler​​方法,如果返回true,则代表放行,会执行原始Controller类中要请求的方法,如果返回false,则代表拦截,后面的就不会再执行了(你的原始方法也不会执行)。

步骤2:配置拦截器类

也就是配置你执行什么样的请求的时候你的拦截器会生效

配置拦截器的地方与我们前面配置页面静态资源放行的地方是一样的。

在配置的时候我们要把拦截器给添加进去,这里我们使用自动装配进行注入。

@Configurationpublic class SpringMvcSupport extends WebMvcConfigurationSupport { @Autowired private ProjectInterceptor projectInterceptor; @Override protected void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/pages/**").addResourceLocations("/pages/"); } @Override protected void addInterceptors(InterceptorRegistry registry) { //配置拦截器 registry.addInterceptor(projectInterceptor).addPathPatterns("/books" ); }}

注意:

//配置拦截器 registry.addInterceptor(projectInterceptor).addPathPatterns("/books" );

如果向上面这样配置拦截器,那么你访问:

localhost/books/100

这样拦截器是不能生效的,你需要修改拦截器的配置:

//配置拦截器 registry.addInterceptor(projectInterceptor).addPathPatterns("/books/*" );

也就是说他是从localhost后面那一级开始配置的

同时我们也可以配置多个:

//配置拦截器 registry.addInterceptor(projectInterceptor).addPathPatterns("/books/*" ,"/books" );

步骤3:SpringMVC添加SpringMvcSupport包扫描

@Configuration@ComponentScan({"com.nefu.controller","com.nefu.config"})@EnableWebMvcpublic class SpringMvcConfig{ }

步骤4:运行程序测试

使用PostMan发送​​class SpringMvcSupport extends WebMvcConfigurationSupport { @Autowired private ProjectInterceptor projectInterceptor; @Override protected void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/pages/**").addResourceLocations("/pages/"); } @Override protected void addInterceptors(InterceptorRegistry registry) { //配置拦截器 registry.addInterceptor(projectInterceptor).addPathPatterns("/books","/books/*" ); }}

这个时候,如果再次访问​​class SpringMvcConfig implements WebMvcConfigurer { @Autowired private ProjectInterceptor projectInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { //配置多拦截器 registry.addInterceptor(projectInterceptor).addPathPatterns("/books","/books/*"); }}

此后咱们就不用再写​​SpringMvcSupport​​类了。

总结

最后我们来看下拦截器的执行流程:

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

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

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

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:springboot+hutool批量生成二维码压缩导出功能
下一篇:[SpringMVC]拦截器②(拦截器参数、拦截器链配置)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~