依赖性:
过滤器是 Java Servlet 规范的一部分,因此须要依赖 Servlet API。
拦截器是 Spring MVC 框架的一部分,因此须要依赖 Spring MVC 框架。
事情事理:
过滤器是基于回调函数的。当要求到达 Servlet 容器时,会依次触发各个过滤器链中的过滤器。每个过滤器都可以对要求进行处理,并可以选择是否将要求通报给下一个过滤器或直接返回相应。
拦截器是基于 Java 反射机制的。当要求到达 Spring MVC 框架时,会依次触发各个拦截器链中的拦截器。每个拦截器都可以对要求进行处理,并可以选择是否连续实行下一个拦截器或直接返回相应。
浸染范围:
过滤器可以对所有类型的要求进行拦截,包括静态资源要求、JSP 要求、Servlet 要求等。
拦截器只能对 Spring MVC 掌握器处理的要求进行拦截。
功能:
过滤器常日用于实现通用的、与框架无关的功能,例如:
身份验证和授权
日志记录
要乞降相应的编码转换
压缩和解压缩
拦截器常日用于实现与 Spring MVC 框架干系的功能,例如:
验证用户身份
拦截特定要求或参数
实行业务逻辑
处理非常
总结:
特性过滤器拦截器
依赖性Servlet APISpring MVC 框架
事情事理基于回调函数基于 Java 反射机制
浸染范围所有类型的要求Spring MVC 掌握器处理的要求
功能通用功能与 Spring MVC 框架干系功能
一样平常来说,建议优先利用拦截器,由于它更符合 Spring MVC 框架的开拓模式,并且可以利用 Spring 框架供应的各种功能。 但是在须要处理与框架无关的通用功能时,可以利用过滤器。
以下是一些 Spring Boot 中利用过滤器和拦截器的示例:
利用过滤器进行身份验证:
Java
public class AuthenticationFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// 从要求中获取用户凭据
String username = request.getParameter("username");
String password = request.getParameter("password");
// 验证用户凭据
if (isValidCredentials(username, password)) {
// 许可用户连续访问
chain.doFilter(request, response);
} else {
// 谢绝用户访问
response.sendError(HttpServletResponse.SC_UNAUTHORIZED);
}
}
}
利用拦截器拦截特定要求:
Java
public class AdminAccessInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 检讨用户是否有访问管理员页面的权限
if (isGrantedAdminAccess(request.getUserPrincipal())) {
return true;
} else {
// 谢绝用户访问
response.sendRedirect("/login");
return false;
}
}
}