项目搭建[6]springboot引入拦截器和过滤器

拦截器和过滤器

拦截器和过滤器可以在收到客户端数据或返回数据给客户端时做统一的处理。是面向切面的思想。

不同的是,拦截器是Spring提供的处理办法,而过滤器是Tomcat针对Servlet提供的方法。

springboot引入拦截器(Interceptor)

本例以拦截器处理注解为例:

创建注解LoginRequired

1
2
3
4
5
6
7
/**
* 在需要登录验证的Controller的方法上使用此注解
*/
@Target({ElementType.METHOD})// 可用在方法名上
@Retention(RetentionPolicy.RUNTIME)// 运行时有效
public @interface LoginRequired {
}

创建拦截器AuthorityIntercepter

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class AuthorityInterceptor extends HandlerInterceptorAdapter{

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 如果不是映射到方法直接通过
if (!(handler instanceof HandlerMethod)) {
return true;
}
// ①:START 方法注解级拦截器
HandlerMethod handlerMethod = (HandlerMethod) handler;
Method method = handlerMethod.getMethod();
// 判断接口是否需要登录
LoginRequired methodAnnotation = method.getAnnotation(LoginRequired.class);
// 有 @LoginRequired 注解,需要认证
if (methodAnnotation != null) {
// 这写你拦截需要干的事儿,比如取缓存,SESSION,权限判断等
System.out.println("====================================");
return true;
}
return true;
}
}

将拦截器添加到配置中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Configuration
public class WebConfigurer implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 拦截所有请求,通过判断是否有 @LoginRequired 注解 决定是否需要登录
registry.addInterceptor(AuthorityInterceptor()).addPathPatterns("/**");
}
@Bean
public LoginInterceptor LoginInterceptor() {
return new LoginInterceptor();
}

@Bean
public AuthorityInterceptor AuthorityInterceptor() {
return new AuthorityInterceptor();

}

springBoot引入过滤器

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
@Component
@WebFilter(urlPatterns="/**",filterName="loginFilter")
public class LoginFilter implements Filter{

//排除不拦截的url
private static final String[] excludePathPatterns = { "/stuInfo/"};

@Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
}

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {

HttpServletRequest req = (HttpServletRequest)request;
HttpServletResponse res = (HttpServletResponse)response;

// 获取请求url地址,不拦截excludePathPatterns中的url
String url = req.getRequestURI();
if (Arrays.asList(excludePathPatterns).contains(url)) {
//放行,相当于第一种方法中LoginInterceptor返回值为true
chain.doFilter(request, response);
}
//业务代码
}

@Override
public void destroy() {
// TODO Auto-generated method stub
}

}