攔截器和過(guò)濾器是Java Web開(kāi)發(fā)中非常重要的組件,可以用于處理請(qǐng)求和響應(yīng)。
攔截器和過(guò)濾器的作用相似,但又有一些不同。攔截器是基于Java反射機(jī)制實(shí)現(xiàn)的,通過(guò)AOP思想實(shí)現(xiàn),可以在方法執(zhí)行前、執(zhí)行后之外,實(shí)現(xiàn)方法拋出異常后的操作;而過(guò)濾器是在Servlet規(guī)范中定義的組件,可以攔截請(qǐng)求和響應(yīng),并對(duì)它們進(jìn)行處理。
攔截器和過(guò)濾器的使用也有所差異。在Spring框架中,攔截器可以使用注解進(jìn)行標(biāo)注,也可以通過(guò)繼承HandlerInterceptorAdapter類實(shí)現(xiàn),而過(guò)濾器則需要在web.xml文件中進(jìn)行配置,并且需要實(shí)現(xiàn)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; } } } // 過(guò)濾器示例代碼 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() { } }
因?yàn)閿r截器和過(guò)濾器在Java Web開(kāi)發(fā)中發(fā)揮著重要的作用,所以在面試中也會(huì)經(jīng)常涉及到關(guān)于攔截器和過(guò)濾器的問(wèn)題,包括如何實(shí)現(xiàn)、有什么區(qū)別、在什么場(chǎng)景下使用等等。