过滤器
Filter依赖于servlet容器,属于servlet规范的一部分
Filter的生命周期由servlet容器管理
Filter可拦截所有web资源(包括jsp,Servlet,静态资源,Controller)
自定义Filter
import javax.servlet.*;
@WebFilter(urlPatterns = "/*") //过滤以/开头的任意请求
public class MyFilter implements Filter {@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest)servletRequest;//ip地址String remoteAddr = request.getRemoteAddr();HttpSession session = request.getSession();Integer count = (Integer)session.getAttribute("count");count = Objects.isNull(count)?1:++count;session.setAttribute("count",count);System.out.println("MyFilter "+ remoteAddr + " "+ count);//放行filterChain.doFilter(servletRequest, servletResponse);}
}
启动类上添加servlet组件扫描
@ServletComponentScan(basePackages = "com.meteorological.filtertest")
public class SpringbootApplication {public static void main(String[] args){SpringApplication.run(SpringbootApplication.class, args);}
}
任意Controller执行时都会被自定义过滤器MyFilter拦截
拦截器
Interceptor依赖于SpringMVC框架
Interceptor通过IOC容器来管理,可通过注入等方式来获取其Bean的实例
Interceptor则只拦截Controller
自定义拦截器
public class MyInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//ip地址String remoteAddr = request.getRemoteAddr();HttpSession session = request.getSession();Integer count = (Integer)session.getAttribute("count");count = Objects.isNull(count)?1:++count;session.setAttribute("count",count);System.out.println("MyInterceptor "+ remoteAddr + " "+ count);//放行return true;}
}
将自定义拦截器添加到ioc容器中
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {//将自定义拦截器添加到ioc容器中registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**");}
}