Java配置拦截器

拦截器的概念

image-20240314161915068

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

拦截器使用

步骤一:创建拦截器

创建的拦截器类继承HandlerInterceptor的三个方法

preHandle:原始方法调用前执行的内容

postHandle:原始方法调用后执行的内容

afterCompletion:原始方法调用完成后执行的内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@Component
public class ProjectInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle...");
//这里如果是false表示直接拦截,即直接退出
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...");
}
}

1630679464294

步骤二:配置拦截器类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {
@Autowired
private ProjectInterceptor projectInterceptor;


@Override
protected void addInterceptors(InterceptorRegistry registry) {
//配置拦截器
registry.addResourceHandler("/pages/**").addResourceLocations("/pages/");

//以下地址直接放行
registry.addInterceptor(new ProjectInterceptor())
.excludePathPatterns(
"/shop/**",
"/voucher/**",
"/shop-type/**",
"/upload/**",
"/blog/hot",
"/user/code",
"/user/login"
).order(1);
}
}

第一段拦截器:addResourceHandlers 方法用于配置静态资源的处理。这里,所有以 /pages/ 开头的请求路径(通过 /pages/** 通配符匹配)都会被映射到应用服务器上的 /pages/ 目录下。这样,当用户请求 /pages/somefile.html 时,Spring MVC会在 /pages/ 目录下查找 somefile.html 文件,并返回给客户端

第二段拦截器:addInterceptors 方法用于注册请求拦截器。这里,projectInterceptor 是一个已经定义好的拦截器实例(没有在提供的代码段中定义),它会被添加到拦截器注册表中,并且只拦截那些请求路径匹配 /books 的请求。这意味着,当请求路径为 /books/books/someSubPath 等时,projectInterceptor 会被触发,执行其预定义的拦截逻辑(比如检查用户权限、记录日志等)。