Java高频面试题:过滤器和拦截器两位难兄难弟区别(Java面试必问:过滤器和拦截器的区别与实战应用)
原创
一、引言
在Java Web开发中,过滤器和拦截器是两个经常性被提及的概念,它们都是用来处理HTTP请求和响应的。尽管它们有相似的功能,但它们在实现和使用上有着本质的区别。本文将详细介绍过滤器和拦截器的区别,并通过实际案例展示它们的实战应用。
二、过滤器(Filter)
过滤器是Servlet规范中的一部分,它用于对请求进行预处理和响应后处理。过滤器可以用于实现身份验证、日志记录、数据压缩等功能。
2.1 过滤器的工作原理
过滤器通过实现 javax.servlet.Filter 接口来创建。当请求到达服务器时,服务器会先调用过滤器的 doFilter 方法,然后才调用目标 Servlet。以下是过滤器的基本工作流程:
public interface Filter {
void init(FilterConfig filterConfig) throws ServletException;
void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException;
void destroy();
}
2.2 过滤器的配置
在 web.xml 文件中配置过滤器,如下所示:
myFilter
com.example.MyFilter
myFilter
/*
三、拦截器(Interceptor)
拦截器是Spring框架的一部分,它用于在控制器方法执行前后进行预处理和后处理。拦截器通常用于实现权限验证、日志记录、事务管理等功能。
3.1 拦截器的工作原理
拦截器通过实现 org.springframework.web.servlet.HandlerInterceptor 接口来创建。拦截器的基本工作流程如下:
public interface HandlerInterceptor {
boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler);
void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView);
void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex);
}
3.2 拦截器的配置
在 Spring MVC 的配置文件中配置拦截器,如下所示:
四、过滤器和拦截器的区别
以下是过滤器和拦截器的核心区别:
1. 规范不同
过滤器是Servlet规范的一部分,而拦截器是Spring框架的一部分。
2. 工作层次不同
过滤器在Servlet容器层面工作,而拦截器在Spring MVC层面工作。
3. 执行时机不同
过滤器在请求到达服务器时首先被调用,而拦截器在请求到达控制器方法之前被调用。
4. 功能差异
过滤器可以处理请求和响应,而拦截器核心处理请求。
五、实战应用
下面将通过两个示例来展示过滤器和拦截器的实际应用。
5.1 过滤器示例:字符编码过滤器
字符编码过滤器用于设置请求和响应的字符编码,防止乱码问题。
@WebFilter("/*")
public class EncodingFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
chain.doFilter(request, response);
}
}
5.2 拦截器示例:登录拦截器
登录拦截器用于验证用户是否已经登录,如果未登录,则重定向到登录页面。
@Component
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
Object user = request.getSession().getAttribute("user");
if (user == null) {
response.sendRedirect("/login");
return false;
}
return true;
}
}
六、总结
过滤器和拦截器虽然都可以用于处理HTTP请求和响应,但它们在规范、工作层次、执行时机和功能上有着本质的区别。在实际开发中,应选用具体需求选择合适的组件。本文通过字符编码过滤器和登录拦截器两个示例,展示了过滤器和拦截器的实际应用。