A. 面试官:谈谈过滤器和拦截器的区别
拦截器(Interceptor)与过滤器(Filter)是两种在Java Web开发中用于控制和处理请求的重要技术。它们在功能、作用范围和实现方式上存在区别。
首先,拦截器(Interceptor)主要用于控制Action的执行流程,它只对action请求起作用,即对外访问路径。而过滤器(Filter)则更广泛地应用于几乎所有的请求,包括css、js等资源文件,因此其作用范围更为广泛。
在Servlet和Controller控制器之间执行拦截器操作,而过滤器则在请求进入Tomcat容器之后执行,但在此之前。在web.xml文件中,Filter的加载顺序为context-param、listener、filter、servlet,同样,在请求结束返回时,Filter在Servlet处理完之后执行。
为了实现拦截器功能,需要创建一个实现了HandlerInterceptor接口的类,并在SpringMVC的配置文件中进行配置。这样,当访问的请求不为特定路径时,如/user/doLogin.do会被拦截并重定向到该路径,但访问其他页面不会被拦截。若想让页面也被拦截,引入过滤器实现。
过滤器的实现同样需要创建一个实现了javax.servlet.Filter接口的类,并在web.xml中进行配置。通过Filter,可以对web服务器管理的所有web资源进行拦截,实现如权限访问控制、过滤敏感词汇、压缩响应信息等高级功能。
总结而言,拦截器和过滤器在Java Web开发中分别用于控制Action执行流程和管理所有web资源请求。它们都基于AOP编程思想,能够实现权限检查、日志记录等功能,但使用范围、规范存在差异。过滤器的作用更为广泛,拦截器则聚焦于特定路径的请求控制。在理解它们的基础上,开发者可以根据实际需求选择合适的技术进行应用。