Springboot–拦截器、过滤器
拦截器和过滤器的区别
- 拦截器不依赖于servlet容器,这是springMVC自带的,过滤器依赖于servlet容器
- 拦截器是基于java的反射机制,过滤器是基于函数的回调
- 拦截器只能对action请求起作用,而过滤器可以对几乎所有的请求起作用
- 过滤器博包裹Servlet,而servlet包裹了拦截器
- 拦截器可以获取IOC容器中的bean,过滤器不可以(拦截器注入服务层即可)因为拦截器就是springMVC提供的,然后springMVC存在Controller中,Controller又可以访问服务层
拦截器实现
preHandle是请求执行前执行的,postHandler是请求结束执行的,但只有preHandle方法返回true的时候才会执行,afterCompletion是视图渲染完成后才执行,同样需要preHandle返回true
所以在拦截器中,最重要的还是preHandler这个方法
@Slf4j
@Component
public class UserHandlerInterceptor implements HandlerInterceptor {/*** 判断用户是否登录* 登录则放行* 反之拦截进行重定向* @param request* @param response* @param handler* @return* @throws Exception*/@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {log.info("拦截器开始执行");User login_user = (User) request.getSession().getAttribute("LOGIN_USER");if (login_user == null) {log.info("拦截器:用户未登录");// 重定向response.sendRedirect("/user/to_login");return false;}log.info("拦截器放行");return true;}
}
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {@Autowiredprivate UserHandlerInterceptor userHandlerInterceptor;/*** 注册过滤器* @param registry*/@Overridepublic void addInterceptors(InterceptorRegistry registry) {// 注册拦截器 拦截路径为 /** 放行 /user/to_login /user/login路径registry.addInterceptor(userHandlerInterceptor).addPathPatterns("/**").excludePathPatterns("/user/to_login","/user/login");}
}
过滤器实现
通过**@WebFilter("/*")**实现对所有请求路径的过滤
实现Filter接口(javax.servlet包)
实现接口之后我们重写一下方法,先看一下每个方法的作用吧。
@Overridepublic void init(FilterConfig filterConfig) throws ServletException {log.info("过滤器初始化"); // 在服务启动时初始化}
@Override
public void destroy() {log.info("过滤器销毁"); // 在服务销毁时销毁
}
/*** 这也是过滤器的一个核心* 这里我同样用来做一个是否登录的校验 也可以进行权限的管理* filterChain过滤器链对象,通过该对象的doFilter方法可以放行该请求* @param servletRequest* @param servletResponse* @param filterChain* @throws IOException* @throws ServletException*/
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {log.info("过滤器执行");HttpServletRequest request = (HttpServletRequest) servletRequest;log.info("请求路径::"+request.getRequestURI());String requestURI = request.getRequestURI();log.info("过滤器执行");// 判断用户是否登录User login_user = (User) request.getSession().getAttribute("LOGIN_USER");if(requestURI.endsWith("/user/to_login") || requestURI.endsWith("/user/login")){// 放行filterChain.doFilter(request,servletResponse);return;}if(login_user != null){// 放行filterChain.doFilter(request,servletResponse);return;}// 重定向response.sendRedirect("/user/to_login");
}
@ServletComponentScan // 使用过滤器时候不要忘记哦
@SpringBootApplication
public class ExamApplicatoin {public static void main(String[] args) {SpringApplication.run(ExamApplicatoin.class,args);}
}
最后我们看一下过滤和拦截器同时存在时候的执行顺序吧