过滤器
1、通过实现Filter接口,创建一个过滤器类
- filterName 指定过滤器名称
- urlPatterns 指定需要进行过滤的路径
- @WebFilter 注册过滤器
@WebFilter(filterName = "authCheckFilter", urlPatterns = "/*")
public class AuthCheckFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//超级admin 无需设置
if (BaseContextHandler.getAdmin()) {
filterChain.doFilter(servletRequest, servletResponse);
} else {
AuthUser authUser = DataAuthUtil.loadAuth(BaseContextHandler.getUserUuid());
//没设置权限信息
if (authUser == null) {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
request.getRequestDispatcher("/ispis/auth/noData.do").forward(request, response);
} else {
filterChain.doFilter(servletRequest, servletResponse);
}
}
}
@Override
public void destroy() {
}
}
2、注册器生效
- 在SpringBoot应用启动类中,添加@ServletComponentScan注解,表示项目启动自动扫描Servlet组件。Filter属于Servlet组件
或者
- 在类上添加@Component注解
拦截器
1、通过实现HandlerInterceptor接口,创建一个拦截器类
public class MyInterceptor implements HandlerInterceptor{
//在请求处理之前进行调用(Controller方法调用之前
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
System.out.printf("preHandle被调用\n");
return true;
}
//请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle被调用\n");
}
//在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作)
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
System.out.println("afterCompletion被调用\n");
}
}
2、创建一个配置类实现WebMvcConfigurer接口,用于注册拦截器
- addPathPatterns方法,需要被拦截的路径
- excludePathPatterns方法,不需要被拦截的路径
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
/**
* 注册拦截器
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**").excludePathPatterns("/a.do");
}
}