在SpringBoot中使用过滤器

在SpringBoot中使用过滤器

1.实现Filter接口

可以重写Filter中的三个方法

name 说明
init(FilterConfig) 创建filter时会调用一次
doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) 拦截客户端请求时调用
destroy() 销毁filter时会调用一次

2.注册拦截器

方式1: 注解注册

通过@WebFilter(filterName, urlPatterns)注解来说明这是一个过滤器

参数 说明
filterName 过滤器名字
urlPatterns 拦截的路径

然后在主启动类上使用@ServletComponentScan注解开启扫描

加上这个注解可以扫描@Servlet@Filter@Listener

方式2: 配置类方式注入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@Configuration
public class FilterConfig {
@Autowired
private Filter1 filter;

@Bean
public FilterRegistrationBean filter() {
//通过FilterRegistrationBean注入Bean
FilterRegistrationBean registration = new FilterRegistrationBean();
//设置过滤器
registration.setFilter(filter);
//设置过滤器名和拦截路径
registration.setName("filter");
registration.addUrlPatterns("/*");
//设置优先级别
registration.setOrder(1);
return registration;
}
}

例子

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
@WebFilter(filterName = "loginCheckFilter", urlPatterns = "/*")
public class LoginCheckFilter implements Filter {
//路径匹配器
public static final AntPathMatcher PATH_MATCHER = new AntPathMatcher();

@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;

//获取请求的uri
String requestURI = request.getRequestURI();

//判断是否需要处理
String[] urls = new String[]{
//不需要处理的路径
"/employee/login",
"/employee/logout",
"/backend/**",
"/front/**",
"/common/**"
};
if (check(urls, requestURI)) {
//不用处理, 放行
filterChain.doFilter(request, response);
return;
} else if (request.getSession().getAttribute("employee") != null) {
//网页端验证有没有登录
Long id = (Long) request.getSession().getAttribute("employee");
BaseContext.setCurrentId(id);
//已登录, 放行
filterChain.doFilter(request, response);
return;
} else {
//未登录, 拦截
response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));
return;
}
}

/**
* 匹配请求路径是否不需要处理
*
* @param urls
* @param requestURI
* @return
*/
private boolean check(String[] urls, String requestURI) {
for (String url : urls) {
if (PATH_MATCHER.match(url, requestURI)) {
return true;
}
}
return false;
}
}

在SpringBoot中使用过滤器
http://xwww12.github.io/2022/08/09/spring/springboot/在SpringBoot中使用过滤器/
作者
xw
发布于
2022年8月9日
许可协议