依赖性:

过滤器是 Java Servlet 规范的一部分,因此须要依赖 Servlet API。

拦截器是 Spring MVC 框架的一部分,因此须要依赖 Spring MVC 框架。

过滤器拦截jsp请求SpringBoot中的过滤器和拦阻器有什么差别 Ruby

事情事理:

过滤器是基于回调函数的。
当要求到达 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;

}

}

}