依賴於Servlet容器(因此不能使用spring容器的資源)
實現是基於函數回調
能夠對全部請求進行過濾java
依賴於web容器(可使用spring容器的資源)
實現是基於反射
只能對controller請求進行攔截,對直接訪問靜態資源的請求沒法攔截git
Filter前處理->Intercepteor前處理->action->Interceptor後處理->Filter後處理github
preHandle在請求處理以前進行調用。能夠在這個方法中進行初始化或預處理或判斷來決定請求是否要繼續進行下去。web
public class MyFilter1 implements Filter { private static final Logger logger = LoggerFactory.getLogger(MyFilter1.class); @Override public void init(FilterConfig filterConfig) throws ServletException { logger.info("***************MyFilter1 init******************"); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { logger.info("------------MyFilter1-doFilter before---------"); logger.info("-------" + request.getRemoteAddr() + ":" +request.getRemotePort() + "--------"); String usrId = request.getParameter("usrId"); if((usrId == null)||(usrId.isEmpty())||(Integer.parseInt(usrId)<=0)) { HttpServletResponse httpResponse = (HttpServletResponse)response; httpResponse.getWriter().print("Parameter error!"); } else if(Integer.parseInt(usrId) >=1000) { chain.doFilter(request, response); } logger.info("------------MyFilter1-doFilter after---------"); } @Override public void destroy() { logger.info("***************MyFilter1 destroy******************"); } }
Interceptor實現spring
public class LogInterceptor implements HandlerInterceptor { private static final Logger logger = LoggerFactory.getLogger(LogInterceptor.class); @Autowired UserPrivilegeService privilegeService; @Override public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception { logger.info("*********** LogInterceptor preHandle *******************"); long startTime = System.currentTimeMillis(); httpServletRequest.setAttribute("startTime", startTime); return true; } @Override public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception { logger.info("*********** LogInterceptor postHandle *******************"); } @Override public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception { logger.info("*********** LogInterceptor afterCompletion *******************"); long startTime = (Long) httpServletRequest.getAttribute("startTime"); long endTime = System.currentTimeMillis(); logger.info("End Time: " + endTime); logger.info("Time Taken: " + (endTime - startTime)); } }
@Configuration public class FilterConfig { @Bean public FilterRegistrationBean filterRegistrationBean1(){ FilterRegistrationBean bean = new FilterRegistrationBean(); bean.setFilter(new MyFilter1()); bean.addUrlPatterns("/login"); bean.setOrder(1); //值越小優先級越高 return bean; } }
@Configuration public class InterceptorConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new LogInterceptor()); } }
測試代碼ide