攔截器和過濾器是Java Web開發中非常重要的組件,可以用于處理請求和響應。
攔截器和過濾器的作用相似,但又有一些不同。攔截器是基于Java反射機制實現的,通過AOP思想實現,可以在方法執行前、執行后之外,實現方法拋出異常后的操作;而過濾器是在Servlet規范中定義的組件,可以攔截請求和響應,并對它們進行處理。
攔截器和過濾器的使用也有所差異。在Spring框架中,攔截器可以使用注解進行標注,也可以通過繼承HandlerInterceptorAdapter類實現,而過濾器則需要在web.xml文件中進行配置,并且需要實現javax.servlet.Filter接口。
// 攔截器示例代碼 public class LoginInterceptor extends HandlerInterceptorAdapter { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String user = request.getParameter("user"); if (user == null || user.equals("")) { response.sendRedirect("/login.jsp"); return false; } else { return true; } } } // 過濾器示例代碼 public class AuthFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse res = (HttpServletResponse) response; String user = req.getParameter("user"); if (user == null || user.equals("")) { res.sendRedirect("/login.jsp"); } else { chain.doFilter(req, res); } } @Override public void destroy() { } }
因為攔截器和過濾器在Java Web開發中發揮著重要的作用,所以在面試中也會經常涉及到關于攔截器和過濾器的問題,包括如何實現、有什么區別、在什么場景下使用等等。