過濾器
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("/**");}
}