无标题
Interceptor和Filter
拦截器和过滤器的作用是将前端请求阻塞,只有通过了设置的逻辑后才会执行后面的代码
Interceptor是Spring框架中提供的组件,Filter是Servlet提供的组件
再Spring框架中使用Filter需要再启动类上加上
@ServletComponentScan
注解
- Filter需要在web.xml中配置,依赖于Servlet;
- Interceptor需要在SpringMVC中配置,依赖于框架
拦截器(Interceptor)是基于Java的反射机制,而过滤器(Filter)是基于函数回调
拦截器中可以注入 Spring 的 Bean,能够获取到各种需要的 Service 来处理业务逻辑,而过滤器则不行。
具体是什么
过滤器(Filter)
-
执行过程,请求和响应都会经过过滤器
-
实现,实现
javax.servlet
这个包下的接口,/*代表过滤所有资源1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
//过滤的资源路径
public class filter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("初始化方法");
}
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//放行操作
filterChain.doFilter(servletRequest,servletResponse);
}
public void destroy() {
System.out.println("销毁方法");
}
} -
多个过滤器之间可以形成过滤器链,
可以通过注解的形式指定过滤器的执行顺序,默认按照名称的顺序先后执行,通过创建bean可以配置在Spring中的过滤器顺序,通过xml文件创建的过滤器执行顺序就是映射中配置的顺序,具体参照这篇博客
拦截器(Interceptor)
-
执行过程,只会拦截Spring框架中的资源
-
创建拦截器,实现
HandlerInterceptor
接口,/**代表所有路径,/*只代表一级路径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
26
27
28package com.sky.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Dome implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("目标资源执行前进入的方法");
//true代表放行
return true;
}
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("目标资源执行后进入的方法");
}
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("视图渲染完毕进入的方法");
}
} -
注册拦截器,注册顺序即为执行顺序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20//自动注册为Spring的一个Bean,自动检测并注册这个配置类
public class WebMvcConfig implements WebMvcConfigurer {
private TestInterceptor1 testInterceptor1;
private TestInterceptor2 testInterceptor2;
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(testInterceptor1)
.excludePathPatterns("/**/*.css", "/**/*.js", "/**/*.png", "/**/*.jpg", "/**/*.jpeg")
.addPathPatterns("/hello");
registry.addInterceptor(testInterceptor2).addPathPatterns("/hello");
}
}
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 XiaoYu!
评论